TCP连接管理

一些基本的概念可以先看另一篇博客:https://www.cnblogs.com/HannahLihui/p/10078496.html

这篇直接对TCP连接过程做笔记

一、TCP连接的建立

1.TCP连接详细过程

假设运行在主机(客户)的一个进程想跟另一台主机(服务器)上进程建立一个连接

第一步:客户端的TCP首先向服务端的TCP发送一个特殊的TCP报文段。该报文段不包含应用层信息。报文段的SYN(标志位)置1。因此这个报文段也叫SYN报文段。另外客户会随机选择初始序号放在TCP 报文段的序号字段中。报文段会封装在IP数据报,并发送给服务器。为了避免某些安全攻击,会适当随机化初始序号(client_isn)。

第二步:一旦TCP SYN报文段的IP数据报到达服务器主机,服务器会取出该报文段,为TCP连接分配报文段和缓存,并向客户发送允许连接的报文段,这个报文段也不包括应用层数据。

报文段包括三个重要信息。

1.SYN置1

2.确认号字段置为client_isn+1

3.选择自己的初始序号

这个报文段表明服务器已经接收到客户的SYN分组,表示同意该连接,所以初始化好了序号,并用确认号表明期望下一次从客户端收到序号是client_isn+1的报文段。该报文段也叫做SYNACK报文段

第三步:收到SYNACK报文段之后,客户也要分配给连接缓存和变量。客户主要给服务器发送另一个报文段,这最后一个报文段对服务器的允许连接的报文段进行确认(将server_isn+1作为确认号)。连接被确认之后,SYN置0.这个报文段可以携带客户到服务端的应用层信息。

连接建立好之后SYN就置0

为什么是三次握手,而不是两次呢,可以看看知乎的回答,都太有才了啊

https://www.zhihu.com/question/24853633

两次握手主要是防止失效的客户端连接被服务端接受引起错误

为什么连接建立需要三次握手,而不是两次握手?
防止失效的连接请求报文段被服务端接收,从而产生错误。

PS:失效的连接请求:若客户端向服务端发送的连接请求丢失,客户端等待应答超时后就会再次发送连接请求,此时,上一个连接请求就是『失效的』。

若建立连接只需两次握手,客户端并没有太大的变化,仍然需要获得服务端的应答后才进入ESTABLISHED状态,而服务端在收到连接请求后就进入ESTABLISHED状态。此时如果网络拥塞,客户端发送的连接请求迟迟到不了服务端,客户端便超时重发请求,如果服务端正确接收并确认应答,双方便开始通信,通信结束后释放连接。此时,如果那个失效的连接请求抵达了服务端,由于只有两次握手,服务端收到请求就会进入ESTABLISHED状态,等待发送数据或主动发送数据。但此时的客户端早已进入CLOSED状态,服务端将会一直等待下去,这样浪费服务端连接资源。

转载自
链接: https://www.zhihu.com/question/24853633/answer/254224088

二、TCP连接的关闭(四次挥手)

客户应用程序发出关闭连接命令
第一步:客户TCP向服务器发送特殊的TCP报文段,首部的标志位FIN置1
第二步:服务器回送一个确认报文段。
第三步:服务器发送终止报文段,FIN置1.
第四步:客户对服务器的终止报文段进行确认
最后两个主机释放所有TCP资源

三、TCP连接状态转换

猜你喜欢

转载自www.cnblogs.com/HannahLihui/p/10088549.html