您的位置:首页 > 理论基础 > 计算机网络

TCP/IP之间的三次握手以及四次挥手

2017-06-22 19:39 573 查看

TCP的三次握手

  TCP的三次握手,一般都是由客户端发起请求,发送给服务器后,服务器解读信息,发现是一个TCP连接请求,在允许的情况下受理该请求,受理并处理后,此时服务器端已经准备好连接所做的一切服务,随机对客户端发起回应,等待客户端的链接,客户端收到回应之后,意识到服务器已经建立好连接并允许本客户端连接,所以发起对服务器的连接,服务器收到这个消息,二者真正意义上建立链接。

  我画了一个图对应各自的三次握手:

  


  现在我们把每次握手与各自的操作对应起来:

 

第一次客户端发起请求(客户端的第一次握手)SYN报文

  此时客户端调用socket函数,产生一个文件描述符,这个文件描述符描述二者之间的连接。并使用connect函数等待服务器的连接。

第一次服务器端收到请求与对客户端的回应(服务器端的第一、二次握手)SYN+ACK报文

  服务器收到连接请求后,就开始创建一个自己的文件描述符(socket函数),用来描述或者记录对对应客户端的通信,并与客户端进行绑定(bind函数),使服务器端的当前文件描述符唯一,不与别的客户端请求搞混,同时监听这个文件描述符,若有“反应”,即是客户端对服务器发起了数据通信或挥手业务。同时调用accept函数等待客户端的服务请求(即相当于服务器告诉客户端,我建立好了,你可以向我请求服务了)。

客户端收到服务器的应答和正式连接服务器(客户端的第二、三次握手)ACK报文

  

  客户端收到服务器的应答之后,客户端的connect函数成功,此时可以理解为向服务器发送一个信号,告诉服务器我已经连接上了,咱俩可以开始进行一系列的服务了,此时使用原来socket得到的文件描述符进行通信。

  

服务器收到客户端的应答

  

  上面说到,客户端connect函数成功,向服务器发送一个信号,告诉服务器我已经连接上了,咱俩可以开始进行一系列的服务了。服务器收到这个应答之后,二者正式建立通信。且服务器的accept函数成功返回,此时服务器调用read阻塞等待客户端的服务请求。

TCP/IP的四次挥手

  同TCP/IP的三次握手有点不同的是:四次挥手时可以是客户端发起的请求,也可以是服务器端发起的请求。

  我将使用客户端发起断开请求的例子阐述我对于四次挥手的理解。

客户端发起断开连接请求

  客户端向服务器端发送FIN报文,表示自己要从二者之间的连接上断开,同时告诉服务器端,如果你还有数据,则不必关闭连接,可以继续发送数据。

服务器端收到请求

  服务器收到客户端的断开请求。

  发现自己还有数据没有发送完毕,则向客户端发送ACK报文“我还有数据没发完,先别关”,客户端进入FIN_WAIT状态,继续等待服务武器的FIN报文;

服务器发送完数据后,发送可以关闭的应答

  服务器发送完自己的数据后,向客户端发送应答FIN报文“我没有数据可发了”。你可以选择关闭连接了。

客户端收到服务器统一断开的应答

  客户端收到同意断开的请求后,原则上已经可以关闭连接了,但是害怕网络上的丢包问题,导致之前的数据没有收到或丢失,则发送完ACK报文后进入timewait模式,继续等待。等待的时间与具体的算法有关。此时若服务器没有收到ACK报文可以选择重传。

服务器收到客户端应答后

  服务器收到客户端的ACK报文后,断开连接。此时客户端还处于timewait模式,但是服务器端已经和他没有任何关系了,不会对他发送任何信息。所以,此时客户端在自己的timewait时间结束后,就意识到服务器端已经正常关闭连接,所以此时客户端关闭连接。

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: