深度解秘HTTP通信细节 (7)

剩余的数据部分即为TCP协议相关的。TCP也是20B固定长度+可变长度部分。

字节值 字节含义
0xdb9b   16bit源端口。56219  
0x1ba8   16bit目的端口7080  
0xa59a 492f   32bit序列号。2778351919  
0x6d03 e942   32bit确认号号。1828972866. 第六个包的序列号为1828972669, 加上数据长度197, 正好相等  
0x8   4bit首部长度,以4byte为单位。共8*4=32字节。因此TCP报文的可选长度为32-20=12字节  
0b000000   6bit保留位。目前置为0  
0b010000   6bitTCP标志位。从左到右依次是紧急 URG、确认 ACK、推送 PSH、复位 RST、同步 SYN 、终止 FIN。ack有效  
0x100f   滑动窗口大小,滑动窗口即tcp接收缓冲区的大小,用于tcp拥塞控制。4111  
0x1eb9   16bit校验和。  
0x0000   紧急指针。仅在 URG = 1时才有意义,它指出本报文段中的紧急数据的字节数。当 URG = 1 时,发送方 TCP 就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍是普通数据。  

可变长度部分,协议如下:

字节值 字节含义
0x01   无操作  
0x01   无操作  
0x080a 2e4c b314 0f20 3af8   时间戳。Ts val=0x2e4c b314=776778516, ecr=0x0f20 3af8=253770488  

至此,一次完整的http请求的报文就解析完了。你是否觉得也就那样,sso easy?

HTTP协议分析

上面我们把HTTP协议相关的数据给解构了,下面我将对照上面的数据拆解结果,一步步深入理解HTTP的协议。

整体介绍

HTTP(Hypertext Transfer Protocol)超文本传输协议,是在互联网上进行通信时使用的一种协议。更形象一点:HTTP是现代互联网中使用的公共语言。它最著名的应用是用在浏览器的服务器间的通信。

HTTP属于应用层协议,底层是靠TCP进行可靠地信息传输。

HTTP层次

HTTP在传输一段报文时,会以流的形式将报文数据的内容通过一条打开的TCP连接按序传输。TCP接到上层应用交给它的数据流之后,会按序将数据流打散成一个个的分段。再交到IP层,通过网络进行传输。另一端的接收方则相反,它们将接收到的分段按序组装好,交给上层HTTP协议进行处理。

tcp http structure

编码

我们再来回顾一下:

url 值
原始url   /data?cmd=Fence2Area&meta={"caller":"test","TraceId":"test"}&request={"fence":[{"lng":10.2,"lat":10.2}, {"lng":10.2,"lat":8.2}, {"lng":8.2,"lat":8.2}, {"lng":8.2,"lat":10.2}],"coordtype":2}  
编码后url   /data?cmd=Fence2Area&meta={%22caller%22:%22test%22,%22TraceId%22:%22test%22}&request={%22fence%22:[{%22lng%22:10.2,%22lat%22:10.2},%20{%22lng%22:10.2,%22lat%22:8.2},%20{%22lng%22:8.2,%22lat%22:8.2},%20{%22lng%22:8.2,%22lat%22:10.2}],%22coordtype%22:2}  

我们看到多了很多%22,0x22是"的ascii值,

一方面,URL描述的资源为了能通过其他各种协议传送,但是有些协议在传输过程中会剥去一些特定的字符;另一方面,URL还是可读的,所以那些不可打印的字符就不能在URL中使用了,如空格;最后,URL还得是完整的,它需要支持所有语言的字符。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpywyy.html