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时间结束后,就意识到服务器端已经正常关闭连接,所以此时客户端关闭连接。
相关文章推荐
- 常见TCP/IP、HTTP协议以及三次握手和四次挥手
- tcp/ip主机到主机的数据传输,以及三次握手和四次挥手的简单理解
- (转载)TCP/IP的三次握手与四次挥手
- TCP/IP 三次握手、四次挥手原理
- IP和TCP协议字段讲解以及TCP的三次握手和四次断开过程
- tcp-ip的三次握手和四次挥手
- TCP/IP三次握手与四次挥手
- TCP/IP三次握手和四次挥手
- TCP/IP三次握手与四次挥手原理解析
- TCP/IP三次握手与四次挥手
- TCP/IP三次握手和四次挥手
- TCP/IP三次握手与四次挥手
- TCP/IP的三次握手连接和四次挥手关闭
- TCP/IP三次握手四次挥手
- TCP/IP的三次握手与四次挥手详解
- TCP/IP 三次握手、四次挥手
- TCP的三次握手/四次挥手以及状态变迁图
- TCP的三次握手/四次挥手以及状态变迁图
- TCP/IP的三次握手和四次分手以及超时机制
- TCP/IP三次握手与四次挥手