TCP/IP——TCP三次握手和四次挥手

867 阅读3分钟

引言

TCP三次握手和四次挥手是面试中经常会问到的问题,也是TCP协议中非常重要的一环。由于TCP是面向连接的协议,那么如何优雅地建立连接和释放连接一定是设计者当时精心设计过的。

预备知识

TCP报头

我们需要关注有序号、确认序号以及ACK、SYH和FIN标志位。其中序号以及确认号不仅在TCP连接和断开是有作用,它们对于TCP的可靠传输也起到了十分重要的作用。连接和断开消息本质上也是报文,它们之间传输的可靠性也高度依赖TCP的确认机制。

确认机制

在TCP中,当发送端发送数据时,会给自己数据确定一个序号,随着发送数据的增多,序号逐渐增大,直到超过65535,再从0开始计数。而接收端接收到数据之后,要返回一个确认信号给接收端,这个确认信号就写在确认号当中,它的含义是:假设确认序号为x+1,代表发送端发送的序号为x的报文已经收到,期待收到序号为x+1号的报文。

连接建立(三次握手)

  1. 请求端向接收端发送一个同步报文,同步报文没有内容,只包含TCP报头。作为本次连接(虽然不一定能连接成功)的第一个报文,它的序号却不一定为0,而是[0,65535]之间的一个随机数,假设为x。并且报头中SYN标志位为1。
  2. 接收端一直在监听着机器上的一系列端口,当接收端收到请求端发送过来的第一个请求连接报文时,如果允许它连接,则会发送一个确认报文,该报文依然没有数据内容,报头也有特定的要求:对刚收到的请求连接信号进行确认,所以确认序号为x+1,因为要确认的报文序号是x,同时ACK标志位为1;同时它作为一个报文,也有自己的序号,同样是一个[0,65535]的随机整数,假设是y;它不仅是个报文,还是个建立连接的报文,所以SYN也为1
  3. 发送端接收到同步报文后,表示接收端同意它进行连接,那么就发送最后一个确认报文,对接收端发过来的同步报文进行确认:ACK标志位为1,确认序号为y+1,同时序号变为x+1,因为上一个发送的消息序号为x

连接释放(四次挥手)

  1. 请求端数据发送完毕之后向接收端发送结束连接报文:报头中FIN标志位为1,同时序号为x,因为前面已经发送过数据,所以x的值为前面发送过的消息序号的下一个值。
  2. 接收端收到连接释放信号,并对该消息发送一个确认信号。标志位和序号的规则和三次握手类似。但此时虽然发送端数据已经发送完毕,但是接收端不一定,所以通道并未完全关闭,在发送确认信号之后接收端依然可以向发送端发送数据。
  3. 当接收端的数据也发送完毕时,接收端也向发送端发送一个释放连接信号。
  4. 发送端对收到的释放连接信号进行确认,从而释放了连接。

总结

TCP的连接和释放其实远不止这些内容,其中涉及的细节也是非常多,有机会再另作总结。