TCP特点
Transmission Control Protocol
- 面向连接。重发。
- 可靠
- 检验和
- 序列号
- 确认应答
- 重发控制
- 连接管理
- 窗口控制
三次握手
使用RT-thread的TCP客户端实验。进行抓包分析。qemu ip地址为下面参数。
ip address: 192.168.137.28
主机参数为
IPv4 地址 . . . . . . . . . . . . : 192.168.1.102
wireshark抓包设置为
ip.addr == 192.168.137.28 and tcp
wireshark抓到的包
使用IPOP发送与接收到的数据
This is TCP Client from RT-Thread.
zhou
This is TCP Client from RT-Thread.
cheng
This is TCP Client from RT-Thread.
zhu
This is TCP Client from RT-Thread.
q
分析包
no | Time | Source | Destination | protocal | Length | info |
---|---|---|---|---|---|---|
3 | 0.000278 | 192.168.137.28 | 192.168.1.102 | TCP | 58 | 49155 → 5000 [SYN] Seq=0 Win=8196 Len=0 MSS=1460 |
4 | 0.000408 | 192.168.1.102 | 192.168.137.28 | TCP | 58 | 5000 → 49155 [SYN, ACK] Seq=0 Ack=1 Win=64240 Len=0 MSS=1460 |
5 | 0.000794 | 192.168.137.28 | 192.168.1.102 | TCP | 54 | 49155 → 5000 [ACK] Seq=1 Ack=1 Win=8196 Len=0 |
首先来看 3 号包。
在info里面有SYN标志,表示这个标志在这个包里置位了。源地址为 192.168.137.28。显然这是一个由QEMU发往192.168.1.102(主机的)的TCP包。
TCP的三次握手由客户端发起。服务端返回。然后客户端再发起一个确认包。表示连接建立。
客户端请求服务端连接的包 3号包
SYN Flag,由客户端到服务端。Seq = 0(其实Seq应该是一个随机数。毕竟随机保密好一点。这里为0是巧合)
MSS = Maximum Segment Size,最大分段长度。TCP建立连接时每一个报文段所能承载的最大数据长度。
服务器收到请求后发送给客户端的包 4号包
SYN Flag,ACK Flag,服务器端到客户端。Seq=0。
这里看到AcK为1。其实是应答3号包的Seq。若是3号包Seq = n;那么4号包
if len==0
AcK = n+1;
else
Ack = n+len;
这4号包既是应答3号包又是请求连接包。所以也会有MSS信号。
客户端回应服务端 4号包 的 5号包
AcK = 1 客户端发送给服务端的包
AcK = 1。是因为4号包的Seq = 0。若是4号包Seq = n;那么5号包
if len==0
AcK = n+1;
else
Ack = n+len;
可以看到5号包只有一个ACK Flag。没有SYN Flag。也就是说这里是一个应答包。不是请求连接包。
四次挥手
no | Time | Source | Destination | protocal | Length | info |
---|---|---|---|---|---|---|
21 | 17.399433 | 192.168.137.28 | 192.168.1.102 | TCP | 54 | 49155 → 5000 [FIN, ACK] Seq=137 Ack=41 Win=8156 Len=0 |
22 | 17.399519 | 192.168.1.102 | 192.168.137.28 | TCP | 54 | 5000 → 49155 [ACK] Seq=41 Ack=138 Win=64104 Len=0 |
23 | 17.399812 | 192.168.1.102 | 192.168.137.28 | TCP | 54 | 5000 → 49155 [FIN, ACK] Seq=41 Ack=138 Win=64104 Len=0 |
24 | 17.404604 | 192.168.137.28 | 192.168.1.102 | TCP | 54 | 49155 → 5000 [ACK] Seq=138 Ack=42 Win=8155 Len=0 |
如上面相同分析 客户端发送中断连接的包 21号包
FIN Flag,ACK Flag。Ack = 41,Seq = 。因为20号包 (len = 3,Seq = 38)。
21号由客户端发起的中断连接请求。并且应答20号包。
服务器应答客户端的中断连接包 22号包
ACK Flag; Ack = 138 = (23号包) Seq+1 ;
服务器发送中断连接包 23号包
FIN Flag; Seq = 41.Ack = 138
客户端应答服务端的中断连接包 24号
ACk Flag;Ack = 42 = (23号包) Seq+1;
总结
TCP 的三次握手以及四次挥手过程大抵是了解了。 但是还需要深入了解每一个字节的作用。这当然是下一章的作用了。
参考资料
https://juejin.im/post/5a069b6d51882509e5432656
https://blog.youkuaiyun.com/lg2lh/article/details/51257751
https://blog.youkuaiyun.com/prsniper/article/details/6762145
https://www.rt-thread.org/document/site/tutorial/qemu-network/tcpclient/tcpclient/#_7