TCP协议详解
这是博客的第一篇文章,目的有三个:
- 争对面试中的常见问题做一个系统的总结,彻底搞懂面试中的相关问题;
- TCP 协议是一个复杂的协议,作为第一个主题,能够言之有物;
- 当然最重要的还是希望学习到知识,解决模棱两可的问题;
TCP 协议是什么
首先,我们需要知道TCP
在网络OSI
的七层模型中的第四层——Transport
层,IP
在第三层——Network
层,ARP
在第二层——Data Link
层,在第二层上的数据,我们叫Frame
,在第三层上的数据叫Packet
,第四层的数据叫Segment
。
程序的数据首先会打到TCP
的Segment
中,然后TCP
的Segment
会打到IP
的Packet
中,然后再打到以太网Ethernet
的Frame
中,传到对端后,各个层解析自己的协议,然后把数据交给更高层的协议处理。
我们可以使用tcpdump
抓包查看一个TCP
数据包
hiro@zen:~$ sudo tcpdump -i ens160 port 22 -e -XX -c 10 -v
tcpdump: listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
10:21:06.178852 00:50:56:b6:9e:17 (oui Unknown) > 00:50:56:b6:fa:ff (oui Unknown), ethertype IPv4 (0x0800), length 210: (tos 0x10, ttl 64, id 63496, offset 0, flags [DF], proto TCP (6), length 196)
192.168.71.165.ssh > 192.168.71.174.43516: Flags [P.], cksum 0x115b (incorrect -> 0x0012), seq 3793411968:3793412112, ack 471062190, win 322, options [nop,nop,TS val 1042614901 ecr 1042627494], length 144
0x0000: 0050 56b6 faff 0050 56b6 9e17 0800 4510 .PV....PV.....E.
0x0010: 00c4 f808 4000 4006 3177 c0a8 47a5 c0a8 ....@.@.1w..G...
0x0020: 47ae 0016 a9fc e21a df80 1c13 d6ae 8018 G...............
0x0030: 0142 115b 0000 0101 080a 3e25 0a75 3e25 .B.[......>%.u>%
0x0040: 3ba6 25ea 9f26 818e a6fb 2198 351a f50e ;.%..&....!.5...
0x0050: 50c7 6069 7398 7d97 aded 82f3 8219 feb2 P.`is.}.........
0x0060: dc40 12fa aa07 09f1 49be 3e39 db7c a668 .@......I.>9.|.h
0x0070: 2648 ca9a 2215 f24a 939b 0965 72db 4850 &H.."..J...er.HP
0x0080: 06d8 5c30 dbdf 67f8 ce9b ddc2 30d4 692b ..\0..g.....0.i+
0x0090: f42c 1f1b 9f52 1b08 f97a 60dd ff2b 0f14 .,...R...z`..+..
0x00a0: 01e4 946a a1b3 d2c8 3d37 0af3 5699 6113 ...j....=7..V.a.
0x00b0: 6bf1 20a8 39c7 4ef7 8f56 6538 255f 7584 k...9.N..Ve8%_u.
0x00c0: 4b08 b2b5 0aaf 6c43 da6b acda 1b03 5ddd K.....lC.k....].
0x00d0: 63ae c.
10:21:06.178978 00:50:56:b6:fa:ff (oui Unknown) > 00:50:56:b6:9e:17 (oui Unknown), ethertype IPv4 (0x0800), length 66: (tos 0x0, ttl 64, id 57334, offset 0, flags [DF], proto TCP (6), length 52)
192.168.71.174.43516 > 192.168.71.165.ssh: Flags [.], cksum 0x2f54 (correct), ack 144, win 5458, options [nop,nop,TS val 1042627507 ecr 1042614901], length 0
0x0000: 0050 56b6 9e17 0050 56b6 faff 0800 4500 .PV....PV.....E.
0x0010: 0034 dff6 4000 4006 4a29 c0a8 47ae c0a8 .4..@.@.J)..G...
0x0020: 47a5 a9fc 0016 1c13 d6ae e21a e010 8010 G...............
0x0030: 1552 2f54 0000 0101 080a 3e25 3bb3 3e25 .R/T......>%;.>%
0x0040: 0a75 .u
TCP 的状态机
网络上的传输是没有连接的,包括TCP
也一样,所谓的TCP
连接,其实是通讯双方共同维护的一个连接状态
,让上层看起来像是有连接一样,实现连接状态的基础就是TCP协议状态机
.
一个经典的问题出现了,为什么建立连接需要3次握手,断开连接需要4次握手?
对于建链接的3次握手:主要是要初始化
Sequence Number
的初始值。通信的双方要互相通知对方自己的初始化的Sequence Number
(缩写为ISN:Inital Sequence Number
)——所以叫SYN
,全称Synchronize Sequence Numbers
。也就上图中的x
和y
。这个号要作为以后的数据通信的序号,以保证应用层接收到的数据不会因为网络上的传输的问题而乱序(TCP
会用这个序号来拼接数据)。对于4次挥手:其实你仔细看是2次,因为
TCP
是全双工的,所以,发送方和接收方都需要Fin
和Ack
。只不过,有一方是被动的,所以看上去就成了所谓的4次挥手。如果两边同时断连接,那就会就进入到CLOSING
状态,然后到达TIME_WAIT
状态。
TCP 重传机制
TODO
流量控制
TODO
拥塞控制
TODO