基础知识

具体含义

利用IP进行通信时所必须用到的协议的统称。 具体来说,IP 或 ICMP、TCP或 UDP、 TELNET或是 FTP、HTTP 等都属于 TCP/IP 的协议。它们与 TCP或 IP 的关系紧密,是互联网必不可以少的组成部分。TCP/IP 一词泛指这些协议,因此,有时也称TCP/IP为国际协议族。

image

TCP头部信息

: 指定通信的源端口号、目的端端口号、管理 TCP连接, 控制两个方向的数据流

image

TCP报文各个位置详解

  1. 源端口号:数据发起者的端口号,16bit

  2. 目的端口号:数据接收者的端口号,16bit

  3. 序号:32bit的序列号,由发送方使用

  4. 确认序号:32bit的确认号,是接收数据方期望收到发送方的下一个报文段的序号,因此确认序号应当是上次已成功收到数据字节序号加1

  5. (数据偏移)首部长度:首部中32bit字的数目,可表示15*32bit=60字节的首部。一般首部长度为20字节。

  6. 保留:6bit,均为0

  7. 紧急URG:当URG=1时,表示报文段中有紧急数据,应尽快传送;

  8. 确认比特ACK:ACK = 1时代表这是一个确认的TCP包,取值0则不是确认包;

  9. 推送比特PSH:当发送端PSH=1时,接收端尽快的交付给应用进程;

  10. 复位比特(RST):当RST=1时,表明TCP连接中出现严重差错,必须释放连接,再重新建立连接;

  11. 同步比特SYN:在建立连接时用来同步的序号。SYN=1,ACK=0表示一个连接请求报文段。SYN=1,ACK=1表示同意建立连接。

  12. 终止比特FIN:FIN=1时,表明此报文段的发送端的数据已经发送完毕,并要求释放传输连接。

  13. 窗口:用来控制对方发送的数据量,通知发放已确定的发送窗口上限。

  14. 校验和:该字段检验的范围包括首部和数据这两部分。由发端计算和存储,并由收端进行验证。

  15. 紧急指针:紧急指针在URG=1时才有效,它指出本报文段中的紧急数据的字节数。

  16. 选项:长度可变,最长可达40字节。

wireshark 捕获到的TCP包的每个字段 如下图所示:

image

TCP 三次握手

tcp 建立连接时会有三次握手,如下图所示,抓包获取到了三次握手的三个数据包,第四个包才是 http(应用数据包)。

image

TCP三次握手流程图

image

TCP 四次挥手

TCP断开连接时,会有四次断开过程,如下图所示,wireshark截获到了四次断开的四个数据包。

image

TCP四次挥手流程图

image

TCP特点及其目的

为了通过IP数据报实现可靠性传输,需要考虑很多事情,例如数据的破坏、丢包、重复以及分片顺序混乱等问题。如不能解决这些问题,也就无从谈起可靠传输。

TCP 通过 检验和序列号确认应答重发控制连接管理 以及 窗口控制 等机制实现可靠性传输。

疑问

为什么 TIME_WAIT 状态需要2倍的MSL(Maximum segment lifetime)长度?

  1. To implement TCP’s full-duplex connection termination reliably

如 tcp四次挥手图如示,如果客户端发送的最后一个 ACK 丢掉了,那么服务端就会 restransmit the FIN. 为了接受这个超时和 retransmitted FIN, 客户端需要 TIME_WAIT 的状态;

但为什么TIME_WAIT的状态需要保持2MSL的时长呢,实际上这取决于服务器端FIN超时重传时间RTO(retransmission timeout), 一般情况下, RTO 会小于 MSL, 但是考虑掉最坏的情况, RTO is 2MSL, 所以 TIME_WAIT的状态是2MSL是为了确保最坏情况下可以接收随时间重传的FIN。

  1. To allow old duplicate segments to expire in the network

确保在这个连接中产生的数据可以从网络中消失。这里的某些人可能会有一个问题:客户端回复最后一个ACK后,感觉所有数据包都可以通过一个MSL消失。 为什么所有数据包都需要2MSL才能确保消失呢? 原因是:

假设客户端在一个MSL时间后立即发送ACK,并且服务器在接收到ACK之前随时间开始重新传输FIN,因此如果FIN消失,则需要2MSL。

: 虽然是解释,但仍未触及至根本的原因, 需要继续探究