|
|

需求:每天打开网页或者 APP 应用,浏览的信息,几乎都是通过发送 http、https 请求响应来查看内容,使用 c# 基于超文本传输协议使用原生 Socket 发送 http 请求。
协议
超文本传输协议 (HTTP) 是一种无状态的应用层协议用于分布式、协作式超文本信息系统。
HTTP / 1.1 协议(RFC 9112):超链接登录可见。
HTTP 语义(RFC 9110):超链接登录可见。
请求示例:
GET /hello.txt HTTP/1.1
User-Agent: curl/7.64.1
Host: 超链接登录可见。
Accept-Language: en, mi
响应示例:
HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Accept-Ranges: bytes
Content-Length: 51
Vary: Accept-Encoding
Content-Type: text/plain
Hello World! My content includes a trailing CRLF.
Socket 发送请求
源码如下:
源码支持发送 http、https 协议的请求。如下图:
Connection:close vs keep-alive
如果使用 ReadToEndAsync 读取响应的所有数据,需要将 Connection 设置成 close,如果设置成 keep-alive 会导致读取响应 ReadToEndAsync 卡死。没有卡死的原因:很多 Web 服务器(如 Nginx、Apache 或某些 API 网关)如果发现客户端是原生的自写 Socket,且没有后续动作,或者触发了服务器的空闲超时(通常配置为 5 秒),服务器就会主动发起 FIN 包关闭 TCP 连接。
http 流水线,同时发送多个请求:超链接登录可见。
Transfer-Encoding: chunked 表示数据是以分块的形式传输的。每个数据块前面都有一个指示该块大小的十六进制数字,这个数字后面跟着一个换行符(CRLF),然后是实际的数据内容,再接着另一个换行符来结束这一块。这种编码方式允许服务器在不知道全部内容长度的情况下开始发送数据。
fdd8 就是这样一个十六进制数,它指定了接下来的数据块的大小(以字节为单位)。将 fdd8 从十六进制转换成十进制,我们得到的是 65016 字节。这意味着紧接着 fdd8 和 CRLF 后面有 65016 字节的数据。之后,可能会有更多的数据块,直到遇到一个大小为 0 的块表示传输结束。
fdd8 告诉接收端接下来的数据块长度为 65016 字节。 |
上一篇:HTTP(s) 测试站点汇总(持续更新)
|