首先tcp协议是一个提供可靠连接的协议,并且是一个双全工协议(即数据在两个方向上能同时传递)。
什么是三次握手。
建立连接为什么是三次握手
因为tcp提供可靠连接的协议,这个可靠我理解是相对的。而与之比较的就是udp协议,tcp在建立连接之前会发送一个报文段,被请求方若接收到了对方会回复一个报文段,请求方在接收到确认后,会再回复一个确认的报文段。三次其实是完成双方确认的最少次数。
为什么是四次分手
为什么连接需要三次握手,而断开连接需要四次握手。 根本原因是,tcp协议是一个双全工协议,再建立连接之后双方均可收发数据。既然一个TCP连接是全双工(即数据在两个方向上能同时传递),因此每个方向必须单独地进行关闭。收到一个FIN只意味着在这一方向上没有数据流动。理论上一个TCP连接在收到一个FIN后仍能发送数据,对利用半关闭的应用来说是可能的。 所以所谓四次分手,其实是指TCP连接完全断开所需要的次数。
TCP的状态变迁
TCP socket分两种,监听socket和传输socket两种 监听socket:负责处理网络上来的连接请求(客户端的syn包到达便是连接请求来了,如果不知道syn包,请参看一下TCP三次握手); 传输socket:负责在网络上的两个端点之间传输TCP数据。
未决socket:pending socket,就是某客户端的syn包到达,内核为这个syn包对应的tcp请求生成一个socket,但是此时三次握手并没有完成,这样的socket就是pending socket,是未决连接,没有经过三次握手认证的tcp连接。
已建立连接的socket:established socket,tcp服务器利用三次握手完成对客户端的简单认证之后,未决socket就变成已连接socket,后续可以用这个socket传输数据。
内核为每个tcp服务器维护两个socket队列:未决socket队列和已建立连接的socket队列
|