这是博客的第一篇文章,目的有三个:

  1. 争对面试中的常见问题做一个系统的总结,彻底搞懂面试中的相关问题;
  2. TCP 协议是一个复杂的协议,作为第一个主题,能够言之有物;
  3. 当然最重要的还是希望学习到知识,解决模棱两可的问题;

TCP 协议是什么

首先,我们需要知道TCP在网络OSI的七层模型中的第四层——Transport层,IP在第三层——Network层,ARP在第二层——Data Link层,在第二层上的数据,我们叫Frame,在第三层上的数据叫Packet,第四层的数据叫Segment

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

程序的数据首先会打到TCPSegment中,然后TCPSegment会打到IPPacket中,然后再打到以太网EthernetFrame中,传到对端后,各个层解析自己的协议,然后把数据交给更高层的协议处理。

我们可以使用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协议详解 Safe 第1张

TCP 的状态机

网络上的传输是没有连接的,包括TCP也一样,所谓的TCP连接,其实是通讯双方共同维护的一个连接状态,让上层看起来像是有连接一样,实现连接状态的基础就是TCP协议状态机.

TCP协议详解 Safe 第2张

一个经典的问题出现了,为什么建立连接需要3次握手,断开连接需要4次握手?

对于建链接的3次握手:主要是要初始化Sequence Number的初始值。通信的双方要互相通知对方自己的初始化的Sequence Number(缩写为ISN:Inital Sequence Number)——所以叫SYN,全称Synchronize Sequence Numbers。也就上图中的 xy。这个号要作为以后的数据通信的序号,以保证应用层接收到的数据不会因为网络上的传输的问题而乱序(TCP会用这个序号来拼接数据)。

对于4次挥手:其实你仔细看是2次,因为TCP是全双工的,所以,发送方和接收方都需要FinAck。只不过,有一方是被动的,所以看上去就成了所谓的4次挥手。如果两边同时断连接,那就会就进入到CLOSING状态,然后到达TIME_WAIT状态。

TCP 重传机制

TODO

流量控制

TODO

拥塞控制

TODO

Reference

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄