传输控制协议---TCP

TCP的最主要特点:

  1. 面向连接的运输层协议
  2. 点对点,只有两个端点
  3. 可靠交付(无差错,不丢失,不重复,按序到达):TCP负责发现传输问题,一有问题就要求重新传输,直到所有数据都正确安全的到达目的地
  4. 全双工(发送和接收缓存)
  5. 面向字节流(不保证数据块大小对应,但是字节流完全一样)

TCP三次握手:

  1. TCP客户端向TCP服务器发送SYN报文(SYN=1,seq = x)请求建立连接
  2. TCP服务器收到客户端发来的连接建立报文后,向客户端发送(SYN,ACK)报文(SYN=1,ACK=1,seq = y,ack=x+1),同意建立连接。
  3. TCP客户端向服务器发送ACK报文(ACK=1,seq = x+1,ack = y+1)

TCP四次挥手:

  1. TCP客户端向服务器发送FIN报文(FIN=1,seq = u),请求终止连接
  2. TCP服务器向TCP客户端发送ACK报文(ACK=1, seq = v,ack = u+1),继续进行数据传输。
  3. TCP服务器向客户端发送(FIN,ACK)报文(FIN=1, ACK=1, ack = u+1, seq = w)
  4. TCP客户端向TCP服务器发送ACK报文(ACK=1,seq=u+1,ack=w+1)

扩展:

为什么建立需要三次握手,释放连接需要四次挥手呢?

服务端在LISTEN状态下的SOCKET当收到SYN请求连接的时候,可以把SYN和ACK放在一起发送(SYN起同步作用,ACK起应答作用)

关闭时,服务器端当收到客户端发送的FIN报文的时候,仅仅仅仅仅仅表示客户端没有东西要发送给服务器了,但蛋蛋蛋蛋未必服务器所有的数据已经发送给了客户端,所以服务器未必会马上关闭SOCKET,也就是说,可能服务器还要发送一会数据给客户端,然后再发送FIN报文给客户端表示你同意关闭连接,所以这里的FIN报文和ACK要分开发送。

综上,三次握手其实是减少了一个步骤,第二步将ACK和SYN报文一起发送了,所以少了一步

TIME-WAIT存在的两个理由:

可靠地实现TCP全双工连接的终止。(重发可能丢失的ACK报文,第四步)

虽然双方同意关闭连接,而且挥手的四个报文也已经发送完毕了,按理来说已经可以回到CLOSED状态了,但是,你别忘了,网络是不可靠的,所以无法保证客户端最后发送给服务器的ACK报文一定会被服务器收到,所有有可能服务器处于LAST_ACK状态的SOCKET可能会因为超时未收到ACK而重新发送FIN报文。

允许老的重复的报文在网络中消失(使本连接持续的时间内产生的所有报文从网络中消失)

为什么不能两次握手就搞定?

死锁

猜你喜欢

转载自blog.csdn.net/Mr_XiaoZ/article/details/81380415
今日推荐