剩余的数据部分即为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在传输一段报文时,会以流的形式将报文数据的内容通过一条打开的TCP连接按序传输。TCP接到上层应用交给它的数据流之后,会按序将数据流打散成一个个的分段。再交到IP层,通过网络进行传输。另一端的接收方则相反,它们将接收到的分段按序组装好,交给上层HTTP协议进行处理。
编码我们再来回顾一下:
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还得是完整的,它需要支持所有语言的字符。