本章目录
4. TCP连接
4.1 TCP报文段的首部格式
传输层的TCP协议会将应用层交付下来的报文加上TCP首部,TCP首部有20字节的固定开销,以及有长度可变的部分。
源端口和目的端口各占2个字节,序号和确认号各占4个字节。
- 序号seq:序号seq用来表示从TCP发送方向接收方发送的字节流的起始序号
- TCP连接中传送的字节流中的每个字节都按顺序编号。
- 例如一段报文的序号seq=301,携带的数据长度为100字节,那么下一个报文段的数据序号应该从401开始。
- 确认号ack:==确认号ack是接收方期望收到发送方下一个报文段的第一个数据字节的序号。==只有当ACK=1时,确认序号字段才有效。
- 例如,S收到了C发送过来的seq=501的报文,而数据长度为200字节,这表明S应该正确收到了C发送过来的序号在[501,700]的数据。因此,S期望收到的C发送来的下一个数据序号为701,于是S在发送给C的确认报文段中把确认号置为701.
- 数据偏移:占4位,它指出TCP报文的数据距离TCP报文段的起始处有多远。
- 窗口:占2个字节,用来通知接收方,本报文需要有多大的空间来接收。
标识位:
- 确认标识ACK:用来标识数据包的成功接收。仅当ACK为1的时候,确认才有效。
- 复位标识RST:当RST=1,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立连接;
- 同步标识SYN:建立连接时用来同步序号。当SYN=1,ACK=0时,表明这是一个连接请求报文;当SYN=1,ACK=1时,表示这是一个同意请求报文
- 终止标识FIN:FIN用来释放连接。当FIN=1时,表示此段报文发送方已发送完毕。
4.2 TCP连接如何保证可靠
校 序 重 流 拥
-
校验和
TCP会保持它的首部和数据的校验和,这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果发现校验和有差错,就会丢弃接此报文段,不对这个报文段进行确认。
-
确认应答和序列号
TCP传输时将每个字节的数据都进行了编号,这就是序列号。发送端按序发送报文,接收端按序收到报文后会给发送端一个ACK确认报文,并且该报文中带有ack,表示下一次发送端应该从哪个地方开始发送报文。
-
超时重传
发送端每发出一个报文段,就启动一个定时器。如果发送端发送的报文段一定时间内没有收到ACK确认,就会重新发送该报文段。如果接收端已经有了该报文段,就会丢弃刚刚发送过来的报文段。
超时重传保证报文即使丢失也能再传输,直到成功传输为止,从而保证可靠。
-
流量控制
发送端如果数据发送过快,导致接收端的缓冲区很快就满了,如果持续下去,数据溢出缓冲区,就会出现数据丢失。这时需要在发送端和接收端有一个窗口,窗口的作用为:在发送缓冲区,只有在窗口里面的数据,才能被发送,在接收缓冲区,只有在窗口里的数据才能被接收,接收端收到数据之后,会回复ack,发送端会根据ack的值来判断接收能力,从而动态调整窗口大小,实现流量控制。
-
拥塞控制
如果网络出现拥塞,TCP会根据不同情况,采用不同的算法:慢开始,拥塞避免,快重传,快恢复来对窗口大小cwnd和慢开始门限值ssthresh进行调整,从而降低网络拥塞的可能性。
4.3 ARQ协议
TCP保证可靠传输的确认应答和超时重传机制是靠ARQ协议实现的,ARQ协议:
-
ARQ(Automatic Repeat Quest)自动重传请求,是OSI模型中的错误纠正协议之一。
-
ARQ协议通过确认和重传这两个机制,在不可靠的基础上实现可靠的信息传输。
-
如果发送方在发送后的一段时间内没有收到确认帧,他通常会重新发送。
-
重传的请求是自动进行的,接收方不需要请求发送方重传某个出错的分组。
4.3.1 停止等待ARQ协议
“停止等待”就是每发送完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组。
停止等待协议ARQ的优缺点:
4.3.1.1 无差错情况
4.3.1.2 出现差错情况
如果出现差错,会有两种差错情况:
- B接收M1时检测出了差错,于是B就丢弃M1,其他什么也不做(不通知发送方A)
- M1在传输过程中丢失了,这时B什么也不知道,更什么也不做
这两种差错情况下,接收方B什么也不做。发送方A超过一段时间仍然没有收到确认,就认为刚刚的分组丢失了,就会重传之前这个未被确认的分组。这就是超时重传。
4.3.1.3 确认丢失和确认迟到
Note:确认是名词,指的是接收方给发送方发的ACK确认,不是动词-确定
如果出现了差错,发送方A进行了超时重传,那么接收方B假定收到了这个重传的分组M1。这时接收方B应该采取两个行动:
- 如果之前已经收到过分组M1,那么就会丢弃这个重复的分组M1,不向上交付,否则收下M1
- 向A发送确认
如果传输过程中没有出现差错&#