# RAW

Renamed from what was once the TCP transport layer (the original name was ambiguous), the outbound RAW transport layer sends TCP and UDP data generated by proxy protocol wrappers directly, and the core doesn't use other transport layers (e.g., [XHTTP](https://github.com/XTLS/Xray-core/discussions/4113)) to carry its traffic.

It can be combined with various protocols in multiple ways.

## RawObject

`RawObject` corresponds to the `rawSettings` item in the Transport Protocol.

```json
{
  "acceptProxyProtocol": false,
  "header": {
    "type": "none"
  }
}
```

> `acceptProxyProtocol`: true | false

Only used for inbound, indicating whether to accept the PROXY protocol.

The [PROXY protocol](https://www.haproxy.org/download/2.2/doc/proxy-protocol.txt) is used to transmit the real source IP and port of the request. **If you are not familiar with it, please ignore this item.**

Common reverse proxy software (such as HAProxy and Nginx) can be configured to send it, and VLESS fallbacks xver can also send it.

When filled in as `true`, after the underlying TCP connection is established, the requesting party must first send PROXY protocol v1 or v2, otherwise the connection will be closed.

The default value is `false`

> `header`: [NoneHeaderObject](#noneheaderobject) | [HttpHeaderobject](#httpheaderobject)

Packet header obfuscation settings, the default value is `NoneHeaderObject`

::: tip
HTTP obfuscation cannot be proxied by other HTTP servers (such as Nginx), but it can be proxied by VLESS fallbacks path.
:::

### NoneHeaderObject

No header obfuscation

```json
{
  "type": "none"
}
```

> `type`: "none"

Disable header obfuscation.

### HttpHeaderObject

HTTP header obfuscation. The configuration must be the same between connecting inbound and outbound.

```json
{
  "type": "http",
  "request": {},
  "response": {}
}
```

> `type`: "http"

Enable HTTP header obfuscation.

> `request`: [HTTPRequestObject](#httprequestobject)

HTTP request template.

> `response`: [HTTPResponseObject](#httpresponseobject)

HTTP response template.

#### HTTPRequestObject

```json
{
  "version": "1.1",
  "method": "GET",
  "path": ["/"],
  "headers": {
    "Host": ["www.baidu.com", "www.bing.com"],
    "User-Agent": [
      "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36",
      "Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_2 like Mac OS X) AppleWebKit/601.1 (KHTML, like Gecko) CriOS/53.0.2785.109 Mobile/14A456 Safari/601.1.46"
    ],
    "Accept-Encoding": ["gzip, deflate"],
    "Connection": ["keep-alive"],
    "Pragma": "no-cache"
  }
}
```

> `version`: string

HTTP version, the default value is `"1.1"`

> `method`: string

The HTTP method, the default value is `"GET"`

> `path`: \[ string \]

paths, an array of strings. The default value is `["/"]`. When there are multiple values, a value is chosen randomly for each request.

> `headers`: map{ string, \[ string \]}

HTTP header, a key-value pair, each key represents the name of an HTTP header, and the corresponding value is an array.

Each request will include all the keys and randomly select a corresponding value. Please refer to the **default values** shown in the example above.

#### HTTPResponseObject

```json
{
  "version": "1.1",
  "status": "200",
  "reason": "OK",
  "headers": {
    "Content-Type": ["application/octet-stream", "video/mpeg"],
    "Transfer-Encoding": ["chunked"],
    "Connection": ["keep-alive"],
    "Pragma": "no-cache"
  }
}
```

> `version`: string

HTTP version, default is `"1.1"`

> `status`: string

HTTP status, default is `"200"`

> `reason`: string

HTTP status description, default value is `"OK"`

> `headers`: map {string, \[ string \]}

HTTP header, a key-value pair, each key represents the name of an HTTP header, and the corresponding value is an array.

Each request will include all the keys and randomly select a corresponding value. Please refer to the **default values** shown in the example above.
