zoukankan      html  css  js  c++  java
  • TCP 三次握手 四次挥手

    三次握手

    第一次握手,客户端向服务端发送连接请求报文,其中同步标志位SYN=1,生成的序列号seq=x,客户端的状态由关闭状态转为同步已发送状态;

    第二次握手,服务端向客户端发送确认报文,其中同步标志位SYN=1,确认标志位ACK=1,序列号seq=y,确认号ack=x+1,服务端的状态由监听状态转为同步已接收状态

    第三次握手,客户端向服务端发送确认报文,其中确认标志位ACK=1,确认号ack=y+1,序列号为x+1,客户端将处于连接已建立的状态,服务端收到报文后也由同步已接收状态转为连接已建立的状态

    四次挥手

    第一次挥手:客户端主动关闭,客户端向服务端发送FIN断开请求报文,其中终止标识符FIN=1,顺序号seq假设为u,客户端状态由建立连接状态转为终止等待1状态(FIN-WAIT-1)

    第二次挥手:服务端接收到客户端的FIN报文后,服务端状态由连接建立状态转为等待关闭状态(CLOSE-WAIT),向客户端发送确认报文,其中确认标志位ACK=1,确认号ack=u+1,序列号假设为v;服务端被动关闭;此时客户端不能再向服务端发送数据请求,但服务端仍可以向客户端发送数据,即客户端->服务端方向的连接断开;

    第三次挥手:服务端向客户端发送完最后的报文后,就向客户端发送断开连接报文,其中终止标志位FIN=1,确认标志位ACK=1,确认号ack=u+1,序列号seq假设为w,服务端状态转为LAST-ACK最后确认状态

    第四次挥手:客户端接收到服务端发来的终止报文,向服务端发送确认报文,其中确认标志位ACK=1,确认号ack为w+1,序列号seq=u+1,客户端状态转为时间等待状态(TIME-WAIT),等待2MSL(最大报文段生命周期)后转为连接关闭(CLOSED)状态,服务端接收到确认报文后也转为连接关闭状态(CLOSED)

    常见问题

    【问题1】为什么握手用三次,挥手却用四次

    ​ 服务端接收到客户端的SYN请求连接报文后,可以直接向客户端返回一个SYN+ACK连接报文,其中SYN是用来同步的,ACK是应答信号;但是在关闭连接时,服务端接收到客户端的FIN报文后不一定立即断开socket连接,只有等待服务端向客户端发送完最后的数据之后,才会向客户端发送FIN报文,所以不能一起发送;

    【问题2】为什么TIME_WAIT状态需要等待2MSL(最大报文段生命周期)才会转为CLOSE状态

    ​ TIME_WAIT 用于重发可能丢失的ACK报文;客户端接收到服务端发来的FIN报文,正常情况下客户端向服务端发送ACK报文后可以转为关闭状态,可能存在这样一种情况,客户端发送的ACK报文丢失,服务端接收不到ACK报文后会一直向客户端发送FIN报文,客户端再次接收到FIN报文后会重发ACK报文并等待2MSL时间,以确认服务端最终接收到该ACK报文

    【问题3】为什么用3次握手进行连接
    采用三次握手是为了防止已经失效的连接请求报文又重新发送到服务端,因而产生错误

    两次握手:可能会出现死锁现象,客户端向服务端发送连接请求报文,服务端接收到连接报文返回一个应答报文,根据两次握手协议,服务端就可以向客户端发送应答报文,如果服务端返回的应答报文丢失的情况下,客户端并不能确定服务端是否已准备好,不知道服务端建立什么序号,在这种情况下客户端认为连接还未建立,会忽略掉服务端发送的数据报文,只等待服务端的应答报文,而服务端在发送的数据分组超时后会重复发送,形成死锁。

    【问题4】建立连接后,客户端突然出现了故障怎么办

    ​ TCP还设有一个保活计数器,默认的Keepalive超时2小时,探测次数为5次

  • 相关阅读:
    PHP IDE NetBeans代码主题和除掉竖线解决方案
    初识Python
    从LazyPhp说起
    从Pycharm说起
    准备系统地研究一下"高性能网站开发",挑战很大,希望能坚持到底!
    IIS日志分析[资源]
    见一好东西:Threaded WebDownload class with Progress Callbacks
    ASP.net Application 中使用域用户登录
    看图找错
    汉字转拼音缩写的函数(C#)
  • 原文地址:https://www.cnblogs.com/fyusac/p/13144018.html
Copyright © 2011-2022 走看看