TCP实现可靠传输

1. TCP 和 UDP的区别:

  • TCP面向连接;UDP无连接
  • TCP保证数据的可靠传输,数据传送无差错,不丢失,无重复,按序到达;UDP不保证可靠交付
  • TCP连接一对一;UDP支持更广泛
  • UDP实时性好,效率高,适用场景:短消息传输,大量客户端,对数据安全性要求不高但实时性要求高
  • TCP面向数据流;UDP面向数据报

2. TCP如何保证数据传输的可靠性?

  1. 序列号ACK信号:发送方按照顺序给要发送的数据包的每个字节都标上编号。接收方接收到发送方的数据包之后,回传一个ACK信号,标识下一个需求的数据包初始字节编号。

  2. 超时重发:在等待接收方回传的ACK信号超时后,发送方重发数据包。一旦开始重传,下一次等待的时间间隔指数增长,重发一定次数后还是收不到ACK信号,将强制终止连接。

  3. TCP的连接管理:建立连接的三次握手和断开连接的四次挥手。

  4. 以段为单位发送数据包:在建立TCP连接的同时,两端协商发送数据包的单位,称为“最大消息长度”:MSS。 【TCP数据(MSS字节)】【TCP首部(20字节)】【IP首部(20字节)】

  5. 滑动窗口:以段为单位发送数据包,每发送一个数据包需要等待一个ACK信号,当数据包往返时间越长效率越低。滑动窗口中窗口前端为已发送但为收到ACK的数据,后端为待发送数据。发送端一次发送多个数据,接收端回传收到的连续数据的ACK信号,缓存缺失数据之后的数据包(保持顺序)。发送端当收到ACK信号时,窗口向前依次移动,直到遇到有数据未确认时停止。一段时间后启动超时重传,接收端若收到缺失数据,则和缓存数据一起发送ACK信号,否则,抛弃缓存数据。

  6. 流量控制:TCP首部有一个字段来通知窗口的大小,接收端通过设置来主动控制传输流量。

  7. 拥塞控制:发送端通过拥塞窗口主动控制传输流量。慢启动:防止双方通信刚开始就传送大量数据包,发送端拥塞窗口初始设置为1MSS,每接受一个ACK信号,窗口扩大为两倍。发送数据时,取拥塞窗口和滑动窗口的较小值。同时设定一个慢启动阈值,当拥塞窗口大小超过阈值时,改为线性增长,直到网络拥塞。拥塞时将慢启动阈值设置为当前窗口的的一半,并将拥塞窗口的值设置为1,然后再次重复操作。

3. TCP三次握手

  

 

 

   为什么需要三次?

  1. 确认信息对等,客户端和服务端需要确认自己和对方收发报文的能力

  第一次握手,Server确认了自己收报文,和Client发报文的能力

  第二次握手,Client确认了自己收/发报文和Server收/发报文的能力

  如果没有第三次,那么Server将无法确认自己发报文和Client收报文的能力

  2. 防止超时产生的脏连接

  客户端发送的连接请求超时到达,服务器接收后,如果没有第三次握手确认,而直接建立连接,这个连接是脏连接。而三次握手中,这种超时握手,客户端因为状态不是SYN_SENT,将会丢弃服务端的二次握手,服务端收不到三次握手,最终超时,连接建立失败。

4. TCP四次挥手

  

 

  第一次挥手,客户端发送FIN,客户端不再发送数据

  第二次挥手,服务端返回ACK,告知客户端收到请求,并进入CLOSED_WAIT状态,代表服务端进入收尾阶段,发送剩余数据关闭资源等等。

  第三次挥手,服务端返回FIN,进入LAST_ACK状态,等待客户端确认应答

  第四次挥手,客户端返回ACK,进入TIME_WAIT状态(持续2MSL时间),在此期间若再没有收到服务端请求,则关闭连接进入CLOSED状态

  为什么是2MSL?

  MSL是报文在网络上生存的最长时间。假设最后一次挥手的ACK丢失,而它的最大生存时间是MSL,服务端未收到ACK则会重发FIN,重发的报文生存时间也是MSL,两者一共2MSL。如果在最长等待时间中都未收到服务端的消息,则确认服务端已经关闭,则自己也可关闭了。

 

posted @ 2018-09-01 17:03  walker993  阅读(4791)  评论(0编辑  收藏  举报