前言

前面复习了一遍五层网络模型及一些相关的协议,了解了网络通信的大致样子
网络通信协议(1)网络通信
网络通信协议(2)TCP协议的一些事接下来就了解一下TCP协议

目录

  1. TCP协议
  2. SEQ、ACK
  3. 重传机制
  4. 三次握手
  5. 四次挥手
  6. 总结

TCP协议

传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议

TCP协议的主要功能是完成对数据报的确认、流量控制和网络拥塞;自动检测数据报,并提供错误重发的功能;将多条路径传送的数据报按照原来的顺序进行排列,并对重复数据进行择取;控制超时重发,自动调整超时值;提供自动恢复丢失数据的功能

TCP/IP协议族的一些历史:
技术往事:改变世界的TCP/IP协议

互联网的快速发展基本是基于TCP/IP协议族

2015世界互联网连接图(基于真实的世界互联网真实路由节点绘制出来的):
网络通信协议(2)TCP协议的一些事

SEQ、ACK

TCP数据包放在IP数据里,IP数据包又放在以太网数据帧中
网络通信协议(2)TCP协议的一些事
TCP传输实体接受本地进程的用户数据流,将它们分割成不超过64KB(帧1522字节,其中标头22字节,IP标头最少20字节,TCP标头最少20字节,最后DATA段最多1460字节,实际还要少)

对于用户程序发送的数据流,通常超过1460字节,即要切割成段,分不同的数据帧传送,就需要编号Seq

SEQ

TCP 数据包的编号(SEQ):第一个包的编号SEQ是随机的,后面的编号是 编号+负载长度

每个数据包都包含本包的编号及下一个数据包的编号
网络通信协议(2)TCP协议的一些事
当前包编号为45943,下一个包编号为46183,可知包的负载为240字节

当对方接受了TCP数据包,操作系统就会根据Seq组装,传输层仅负责组装,文件的信息由应用层规定,例HTTP协议的Content-Length规定信息的大小,组装好数据包就发送给应用程序,TCP数据包中有端口参数(port),交给指定程序

ACK(acknowledgement):确认消息

现实中常说的丢包就是传输层的事

服务器发送的数据包常因为速度问题、线路问题导致丢包

最理想的状态是,在线路允许的情况下,达到最高速率,为了测出这个速率,在启动后需要慢慢的探测,TCP 协议为了做到效率与可靠性的统一,设计了一个慢启动(slow start)机制

慢启动:开始的时候,发送得较慢,然后根据丢包的情况,调整速率:如果不丢包,就加快发送速度;如果丢包,就降低发送速度

Client与Server通信:

ACK 携带两个信息:

  • 期待要收到下一个数据包的编号
  • 接收方的接收窗口的剩余容量

网络通信协议(2)TCP协议的一些事
Client每次发送信息:Seq Num数据包编号,Length数据包大小
Server发送确认信息:Ack Num期待下一个包的编号,Window接收窗口大小

TCP是全双工信道,可能收发信息是同时的,ACK只是几个简单字段,通常和数据放一起

网络通信协议(2)TCP协议的一些事
1:左机发送编号为1,长度为100比特的数据包,并请求编号为1的数据包
2:右机接收消息,发送编号为1长度为200比特的数据包,并请求编号为101的数据包
。。。

重传机制

TCP是可靠的通信,有自己的处理丢包的机制:重传机制

超时重传机制

网络通信协议(2)TCP协议的一些事超时时间计算是开启定时器的设定时间,从而保证网络资源利用率,避免因定时器的时间(RTO-Retransmission TimeOut)不确定而影响网络传输效率

每当发送一个数据包时,就启动一个定时器, 而定时器溢出了,发送方还没接收到接收方返回的ACK时,确定重传

Seq与ACK是以字节为单位,即需要连续的包,如果中间丢了包,接收方就会重复发出丢包的ACK请求

缺陷:
接收方会死等数据包11,对于后面接收的包即使收到了,发送方也可能无法确认,导致超过RTO即会重复的发送包(而等待RTO的时间也会浪费)

快速重传机制

因为超时重传机制的缺陷,TCP引进了Fast Retransmit 的算法,不以时间驱动,而以数据驱动重传,即快速重传机制

快速重传机制是发送方在接收端的反馈信息后引发重传,而不是定时器超时重传。快速重传机制要求当接收到失序报文段时,TCP需要立即生成确认信息(重复ACK),并且失序情况表明在后续数据到达前出现了丢包,发送端的工作即为尽快填补丢包带来的数据段空缺

网络通信协议(2)TCP协议的一些事

与超时重传的区别在与没有了RTO,接收到丢包信息就立刻重传,但和超时重传一样,可能会出现不知道后续的包接收端有没有接收到(实际上有些TCP确实会重新发送后面的包)

SACK选项

Selective Acknowledgment (SACK),在TCP头里加一个SACK,ACK还是Fast Retransmit的ACK,SACK则是汇报收到的数据碎版

网络通信协议(2)TCP协议的一些事
这样发送端就知道哪些数据到了哪些没到

对于SACK的使用:
TCP 选择性应答的性能权衡

三次握手

TCP为了准确的将数据包传送到目的地,TCP协议采用三次握手策略建立连接
网络通信协议(2)TCP协议的一些事三次握手:

  1. Client发送SYN(Seq=x)连接请求给服务器,进入SYN_SEND状态
  2. Server接收到SYN数据包,回应一个SYN(Seq=y)、ACK(ACK=x+1)数据包,进入SYN_RECV状态
  3. Client接收到SYN数据包,回应ACK(ACK=y+1)数据包,然后就可以传数据了

三次握手连接策略可以防止很多错误连接

四次挥手

终止连接需要四次挥手,由TCP的半关闭(half-close)造成的

网络通信协议(2)TCP协议的一些事

(1) Client首先调用close,称该端执行“主动关闭”(active close)。该端的TCP于是发送一个FIN分节,表示数据发送完毕,Client进入FIN_WAIT_1状态
(2) Server接收到这个FIN数据包,对端执行 “被动关闭”(passive close),这个FIN由TCP确认。Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态
注意:FIN的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程,放在已排队等候该应用进程接收的任何其他数据之后,因为,FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。
(3) 接收到这个文件结束符的应用进程将调用close关闭它的套接字,Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
(4) Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手

当然,Client或者Server都可以主动提出关闭连接

总结

  • TCP协议是一种面向连接的、可靠的、基于字节流的传输层通信协议,现代互联网的发展就是基于TCP/IP协议族发展起来的
  • 数据帧最多只留了1480字节给TCP协议,TCP协议发送需要分段
  • Seq是TCP数据包的编号,ACK是确认信息,ACK中包含期待的数据编号和自己的窗口宽度
  • TCP协议基于慢启动,启动时需要测试最佳传输速率
  • TCP的可靠性,存在丢包的处理机制:超时重传机制、快速重传机制,SACK选项加强快速重传机制
  • TCP三次握手创建连接,四次挥手终止连接

相关文章: