3.TCP
TCP协议的特点
TCP主要解决传输的可靠、有序、无丢失和不重复问题,主要特点如下:
- TCP是面向连接的传输层协议,TCP连接是一条逻辑连接。
- 一条TCP连接只能是点到点(一对一)的,连接建立采用客户/服务器模式
- 可靠交付的服务,保证传送的数据无差错、不丢失、不重复且有序。
- 全双工通信,为此TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。
- 发送缓存用来暂时存放以下数据:
- 发送应用程序传送给发送方TCP准备发送的数据:
- TCP已发送但尚未收到确认的数据
- 接收缓存用来暂时存放以下数据:
- 按序到达但尚未被接收应用程序读取的数据;
- 不按序到达的数据。
- 发送缓存用来暂时存放以下数据:
- 面向字节流
TCP报文段

其首部的前20B 是固定的。TCP 首部最短为 20B, 后面有4N 字节是根据需要而增加的选项,长度为 4B 的整数倍。
- 序号(seq)。占4B,范围为,共个序号。TCP是面向字节流的(即TCP传送时是逐个字节传送的),所以TCP连接传送的字节流中的每个字节都按顺序编号。序号字段的值指的是本报文段所发送的数据的第一个字节的序号。例如,一报文段的序号字段值是301,而携带的数据共有100B,表明本报文段的数据的最后一个字节的序号是400,因此下一个报文段的数据序号应从401开始。
- 确认号(ack)。占4B,是期望收到对方下一个报文段的第一个数据字节的序号。若确认号为N,则表明到序号N-1为止的所有数据都已正确收到。例如,B正确收到了A发送过来的一个报文段,其序号字段是501,而数据长度是200B(序号501~700),这表明B正确收到了A发送的到序号700为止的数据。因此B期望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701。
- 确认位ACK。为1确认号字段才有效。
- 同步位SYN。为1表示这是一个连接请求或连接接受报文。
TCP连接管理
1.TCP连接的建立

提示
概况来说就是连接建立前,服务器处于LISTEN(收听)状态,客户机发送连接请求报文,这时,TCP客户进程进入SYN-SENT(同步已发送)状态,服务器同意连接的话向客户机发回确认,这时,TCP服务器进程进入SYN-RCVD(同步收到)状态,客户机收到确认后再次向服务器发送确认,告诉服务器我已经收到你发来的确认了,这时,TCP客户进程进入ESTABLISHED(已建立连接)状态。
其中有两个确认号x和y分别是针对客户机的报文段序号和服务器的报文段序号。
2.TCP 连接的释放
参与TCP 连接的两个进程中的任何一个都能终止该连接

提示
客户机打算关闭连接,向其TCP发送连接释放报文,客户机进入FIN-WAIT-1(终止等待1)状态,服务器接收到释放报文后发出确认,服务器进入CLOSE-WAIT(关闭等待)状态,此时客户机到服务器这个方向的连接就释放了,处于半关闭状态,服务器如果没有像客户机发送的数据就通知TCP释放连接,服务器进入LAST-ACK(最后确认)状态,客户机接收到连接释放报文后,发出确认[1],此时TCP连接还未释放,必须经过时间等待计时器设置的时间2MSL(最长报文段寿命)后,客户机才进入CLOSED(连接关闭)状态
TCP 可靠传输
1.序号
TCP 首部的序号字段用来保证数据能有序提交给应用层,TCP 把数据视为一个无结构但有序字节流,序号建立在传送的字节流之上,而不建立在报文段之上。
序号字段的值是指本报文段所发送的数据的第一个宇节的序号。
2.确认
- TCP 首部的确认号是期望收到对方的下一个报文段的数据的第一个字节的序号
- TCP 默认使用累积确认,即TCP 只确认数据流中至第一个丢失字节为止的字节
3.重传
有两种事件会导致TCP 对报文段进行重传:超时和冗余 ACK。
提示
- TCP 规定每当比期望序号大的失序报文段到达时,就发送一个冗余 ACK, 指明下一个期待字节的序号
- TCP 规定当发送方收到对同一个报文段的 3个冗余 ACK 时,就可以认为跟在这个被确认报文段之后的报文段已经丢失。
TCP 是累计确认机制,若没有失序,则不会发送冗余ACK
TCP流量控制
- 接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,这称为接收窗口rwnd
- 发送方根据其对当前网络拥塞程度的估计而确定的窗口值,这称为拥塞窗口cwnd
- 发送窗口取min{rwnd,cwnd}
注意
- 发送窗口大小是字节
- 窗口值表示当前你能发送多少东西出去
TCP 拥塞控制
拥塞控制是指防止过多的数据注入网络,保证网络中的路由器或链路不致过载。出现拥塞时, 端点并不了解拥塞发生的细节,对通信连接的端点来说,拥塞往往表现为通信时延的增加。
拥塞控制与流量控制的区别
拥塞控制是让网络能够承受现有的网络负荷,是一个全局性的过程,涉及所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。相反,流量控制往往是指点对点的通信量的控制,是个端到端的问题(接收端控制发送端),它所要做的是抑制发送端发送数据的速率,以便使接收端来得及接收。
因特网建议标准定义了进行拥塞控制的4 种算法:慢开始、拥塞避免、快重传和快恢复

注意
注意:在慢开始(指数级增长)阶段,若 2cwnd >ssthresh,则下一个 RTT后的 cwnd 等于 ssthresh,而不等于 2cwnd,即 cwnd 不能跃过 Ssthresh 值。如图 5.11 所示,在第16 个轮次时 cwnd =8、ssthresh =12,则在第17个轮次时 cwnd=12,而不等于16。

总结
在TCP连接建立和网络出现超时时,采用慢开始和拥塞避免算法;当发送方接收到冗余 ACK 时,采用快重传和快恢复算法
2MSL之前处于TIME_WAIT状态 ↩︎
