socket断开连接的四次握手及常见过程解析

TCP的协议文档对TCP的一些规定:文档名称-RFC793 

TCP消息头的控制位

    URG:紧急指针字段有效

    ACK:确认头部字段有效

    PSH:强制函数

    RST:重置链接

    SYN:同步系列号码

    FIN:再没有来自发送者的数据

TCP连接过程的各种状态及意义

    LISTEN:等待任何从远端TCP和端口的连接请求

    SYN-SENT:发送一个连接请求以后等待一个匹配的连接请求

    SYN-RECEIVED:发送一个连接请求并收到匹配的连接请求以后等待连接请求被确认

    ESTABLISHED:表示一个打开的连接,接收的数据可以传递给用户,连接的数据传输的正常阶段

    FIN-WAIT-1:等待远端的TCP连接终止请求,或者等待之前发送的连接终止请求确认

    FIN-WAIT-2:等待远端TCP的连接终止请求

    CLOSE-WAIT:等待本地用户的连接终止请求

    CLOSING:等待远端的TCP连接终止请求确认

    LAST-ACK:等待发送给远端的TCP连接终止请求的确认(包括字节的连接终止请求确认)

    TIME-WAIT:等待足够的时间以确认远端TCP收到它的连接终止请求的确认

    CLOSED:不在连接状态

 四次握手协议的过程以及状态变化

1.A端发送FIN通知B端关闭,A端进入WAIT-1状态

2.B端收到FIN后发送给A端FIN消息以及回复A端FIN的ACK消息,同时进入CLOSE状态

3.A端收到B端的FIN和FIN-ACK消息以后切换至CLOSE状态,A端回复B端的FIN-ACK消息以后进入WAIT-2状态

4.B端收到A端的FIN-ACK消息后进入最后的等待阶段,会等待2MSL时长,保证数据全部传送和接收,之后才是真正关闭

 

三次握手的作用

    防止老的重复连接发起导致的混乱,RST消息就是为了处理这种特殊的消息,在同步状态和非同步状态收到RST的TCP端采取不同的措施

 

TCP的半打开状态

    TCP连接的两端没有数据交互,且其中一端异常关闭(比如服务器断电,应用程序异常终止不算异常关闭,操作系统会在fd变为0时自动关闭socket,完成四次握手),此时对端并不知道链接已关闭,这种场景叫做半打开连接。半打开连接中保持打开的一端向socket发送任何数据都会导致收到一个RST消息,RST消息期望收到消息的一端关闭连接。

 

关闭一个连接时如何确保数据已经全部发送或者接收?

    用户需要持续读取数据直到TCP告诉用户已经没有数据可读,手动关闭连接后,TCP仍会保持一段时间,保证用户的数据全部送达,这个期间需要持续从关闭的连接读取数据。

你可能感兴趣的:(socket)