简述 TCP/IP 协议与 TCP 三次握手和四次挥手

574 阅读3分钟

TCP/IP 协议

TCP/IP 协议族共分为4层, 因为该协议家族的两个核心协议 TCP/IP,为该家族中最早通过的标准,所以称为 TCP/IP 协议族,是简化的七层OSI模型

层级应用协议
应用层(application layer)HTTPHTTPSFTPDNSSSH
传输层(transport layer)TCPUDPRTPSCTP
网络层(internet layer)IP、ICMP、ARP
链路层(Network Access (link) layer)以太网Wi-FiMPLS

TCP 的三次握手

TCP 建立连接时,通过三次握手能防止历史连接的建立,能减少双方不必要的资源开销,

  1. 第一次握手(客户端 => 服务端),服务端确认客户端发送能力 OK;
  2. 第二次握手(客户端 <= 服务端),客户端确认服务端的接收、发送能力 OK;
  3. 第三次握手(客户端 => 服务端),服务端确认客户端接收能力 OK;

同时,携带的 SYN 序号能够确保双方同步初始化序列号。序列号能够保证数据包不重复、不丢弃和按序传输。

不使用「两次握手」和「四次握手」的原因:

「两次握手」

  1. 无法防止历史连接的建立,会造成双方资源的浪费:

    谢希仁《计算机网络》书中的举例:“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。” 所以主要目的防止server端一直等待,浪费资源。

  2. 无法可靠的同步双方序列号:

    如果发送方给接收方发送了两个连接请求 SYN1, SYN2,因为网络延迟的原因,当发送方收到ACK时,它并不知道ACK是给SYN1的,还是给SYN2的,所以接收方需要发送ACK3来询问发送方,我这个ACK3是给SYN2(seq= 2+1=3)的可以吗。然后发送方发送一个ACK给接收方,意思是可以,就是这个连接。

「四次握手」

  • 三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数。

TCP的四次挥手:

为什么需要四次挥手

因为TCP连接是全双工可靠的网络协议,允许通信的双方同时进行数据的收发,同样也允许收发两个方向的连接被独立关闭,以避免 client 数据发送完毕,向 server 发送 FIN 关闭连接,而 server 还有发送到 client 的数据没有发送完毕的情况。所以关闭 TCP 连接需要进行四次握手,每次关闭一个方向上的连接需要 FIN 和 ACK 两次握手。至于服务端最后还要发送 FIN 信号,个人认为也是出于节省客户端资源的目的。

参考:

  1. www.cnblogs.com/xiaolincodi…
  2. blog.csdn.net/SilenceOO/a…
  3. zh.wikipedia.org/wiki/TCP/IP…