计算机网络--TCP可靠传输的实现(无拥塞)
TCP报文的格式
三次握手四次挥手
- 序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流。
- 确认号:Ack序号,占32位,只有ACK标志位为1时,Ack序号才有效。Ack=Seq+1。
-
标志位(Flags):URG、ACK、PSH、RST、SYN、FIN
URG:紧急指针有效;
ACK:确认序号有效;
PSH:接收方应尽快移交报文给应用层;
RST:重置连接;
SYN:发起一个新连接;
FIN:释放一个连接。
(注意:确认序号Ack和标志位ACK不一样)
三次握手即TCP连接的建立
第一次握手
- 客户端设置标志位SYN;
- Seq=j;
- 发送TCP报文,客户端进入SYN_SENT状态,等待服务器确认;
第二次握手
- 服务器收到TCP报文;
- 设置标志位SYN+ACK;
- Ack=j+1,Seq=k;
- 发送TCP报文,此时服务器进入SYN_RECV状态;
第三次握手
- 客户端收到服务器的TCP报文;
- 设置标志位ACK;
- Ack=k+1;
- 发送TCP报文, 客户端服务器进入ESTABLISHED,成功建立TCP连接。
四次挥手即TCP连接的释放
第一次
客户端设置标志位FIN=1;
Seq=X;
发送TCP报文;
第二次
服务器设置标志位ACK=1;
Ack=X+1;
发送TCP报文给客户端;
第三次
服务器询问上层应用数据传输是否完毕;
传输完毕后,设置标志位FIN=1;
Seq=Y;
发送TCP报文;
第四次
设置标志位ACK=1;
Ack=Y+1;
发送TCP报文给服务器,服务器客户端断开连接。
TCP基于以字节为单位的滑动窗口实现可靠传输(无拥塞)
三次握手建立连接后,服务器客户端开始发送数据。
从一个例子入手:
发送方向接收方发送数据报文,接收方回复确认报文此时,接收方回复一个确认报文,表明自己的窗口大小20,接收序号31
接收方构建自己的发送窗口,序号31之前是已经接收到并确认的数据,可以从缓冲区删除
若发送方发送31-33的数据,31数据丢失,接收方只收到32-33的数据,此时接收方确认报文只确认最高位数据31,发送方收到确认报文,再次从31号数据开始传输,发送窗口不移动
若31-33号数据发送成功,接收方发送确认报文,并将已确认数据交付主机,接收窗口前移
发送方删除已确认数据,发送窗口前移;
若数据未按序到达、丢吧造成发送窗口耗尽,此时未收到接收方的确认报文,到达一定时间后,触发超时重传机制,重新发送窗口内数据