TCP三次握手和四次断开
三次握手

TCP的三次握手 (建立连接)
三次握手的目的是为了确认客户端和服务端的发送和接收能力都正常,并同步序列号,为后续可靠数据传输做准备。过程如下:第一次握手 (SYN)客户端 -> 服务端:发送一个TCP数据包。标志位:SYN = 1 (表示请求建立连接)序列号:seq = x (客户端随机生成的一个初始序列号)客户端状态:从 CLOSED 进入 SYN-SENT (同步已发送)。第二次握手 (SYN + ACK)服务端 -> 客户端:发送一个TCP数据包。标志位:SYN = 1, ACK = 1 (表示同意建立连接,并确认客户端的序列号)序列号:seq = y (服务端随机生成的一个初始序列号)确认号:ack = x + 1 (表示期望收到客户端的下一个数据包的序列号是x+1,同时也确认了收到了客户端的SYN)服务端状态:从 LISTEN 进入 SYN-RCVD (同步已收到)。第三次握手 (ACK)客户端 -> 服务端:发送一个TCP数据包。标志位:ACK = 1序列号:seq = x + 1 (因为第一次握手的SYN包消耗了一个序列号)确认号:ack = y + 1 (表示期望收到服务端的下一个数据包的序列号是y+1,确认了收到了服务端的SYN)客户端状态:进入 ESTABLISHED (连接已建立)。服务端状态:收到这个ACK后,也进入 ESTABLISHED (连接已建立)。至此,连接建立成功,双方可以开始数据传输。四次断开

TCP的四次断开 (挥手)
四次挥手的目的是为了可靠地终止双向连接。因为TCP连接是全双工的,每个方向必须单独关闭。过程如下:第一次挥手 (FIN)主动关闭方 (假设是客户端) -> 被动关闭方 (服务端):发送一个TCP数据包。标志位:FIN = 1 (表示请求终止连接)序列号:seq = u (等于之前已传送数据的最后一个字节的序列号加1)客户端状态:从 ESTABLISHED 进入 FIN-WAIT-1 (终止等待1)。第二次挥手 (ACK)被动关闭方 (服务端) -> 主动关闭方 (客户端):发送一个TCP数据包。标志位:ACK = 1序列号:seq = v确认号:ack = u + 1 (确认收到了客户端的FIN请求)服务端状态:从 ESTABLISHED 进入 CLOSE-WAIT (关闭等待)。客户端状态:收到这个ACK后,状态从 FIN-WAIT-1 进入 FIN-WAIT-2 (终止等待2)。此时,TCP连接处于半关闭状态。 客户端已经没有数据要发送了,但服务端可能还有数据要发送给客户端,客户端也需要接收。这个状态就是 CLOSE-WAIT。第三次挥手 (FIN)当服务端也没有数据要发送时,它会发起自己的关闭连接请求。被动关闭方 (服务端) -> 主动关闭方 (客户端):发送一个TCP数据包。标志位:FIN = 1, ACK = 1序列号:seq = w (在半关闭状态期间,服务端可能又发送了一些数据)确认号:ack = u + 1 (这个确认号不变,因为它还是对第一次FIN的确认)服务端状态:从 CLOSE-WAIT 进入 LAST-ACK (最后确认)。第四次挥手 (ACK)主动关闭方 (客户端) -> 被动关闭方 (服务端):发送一个TCP数据包。标志位:ACK = 1序列号:seq = u + 1 (因为第一次挥手的FIN包消耗了一个序列号)确认号:ack = w + 1 (确认收到了服务端的FIN请求)客户端状态:从 FIN-WAIT-2 进入 TIME-WAIT (时间等待)。等待 2MSL (两倍的最大报文段生存时间) 后,状态变为 CLOSED。服务端状态:收到这个ACK后,状态从 LAST-ACK 进入 CLOSED。至此,连接完全关闭。TCP机制
四大计时器
重传计时器(Retransmession)
为了防止数据报丢失,当TCP发送一个报文时,就启动重传计时器,有2种情况:
1.若在计时器超时之前收到了特定报文的确认,则撤消这个计时器
2.特定数据报在计时器超时前没有收到确认,则重传该数据报,并把计时器复位
持久计时器(Persistance)
避免死锁,当发送端TCP接收到rwnd=0的确认时,就启动持久计时器,当计时器截止时间到时,发送端TCP需要发送一个特殊的报文,叫做探测报文,该报文只有1字节,有序号,但无需确认,探测报文提醒接收端TCP:确认已丢失,必须重传,持久计时器截止时间设置为重传时间的数值,但是,如果没有收到从接收端回来的响应,则需要发送另外一个探测报文,并将持久计时器的值加倍和复位,如果结果和上面一样,发送端继续发送探测报文,直到其截止时间增大到阈值(通常为60s)为止,在这以后,发送端每60s发送一个探测报文,直到窗口重新打开。
保活计时器(keep-alive)
在某些实现中要使用keeplive timer来防止两个TCP之间出现长时间的空闲
比如客户端打开了服务器端的连接,传送了一些数据,然后就保持静默了,也许该客户端除了故障,在这种情况下,这个连接就永远处于打开状态,保活计时器的解决方法为,当服务器端收到客户端的信息时,就把计时器复位,超时通常设置2小时,若服务器2小时还没有收到客户的信息,就发送探测报文,若发送10个同样的报文(每个相隔75s)还没有收到响应,就认为客户端出了故障,终止这个连接。
时间等待(time-wait)
如果最后一个ACK报文丢失了,那么服务器TCP(它为最后的FIN设置了计时器)以为它的FIN丢失了,因而重传
TCP流控/拥塞管理
原理
接收端处理数据的速度是有限的,如果发送方的速度太快,就会把缓冲区u打满。这个时候如果继续发送数据,就会导致丢包等一系列连锁反应。
所以TCP支持根据接收端能力来决定发送端的发送速度。这个机制叫做流控制。
窗口大小
(接收端向发送端主机通知自己可以接受数据的大小,这个大小限制就叫做窗口大小)。
什么是请求
一次http请求
keepalived
长连接设置。Httpd守护进程,一般都提供了keep-alive timeout时间设置参数。比如nginx的keepalive_timeout,和Apache的KeepAliveTimeout。这个 keepalive_timout时间值意味着:一个http产生的tcp连接在传送完最后一个响应后,还需要hold住 keepalive_timeout秒后,才开始关闭这个连接。当httpd守护进程发送完一个响应后,理应马上主动关闭相应的tcp连接,设置 keepalive_timeout后,httpd守护进程会想说:”再等等吧,看看浏览器还有没有请求过来”,这一等,便是 keepalive_timeout时间。如果守护进程在这个等待的时间里,一直没有收到浏览发过来http请求,则关闭这个http连接。
关闭长连接会如何

直接关闭http连接。
