1。建立连接协议(三次握手)(1)客户端向服务器发送带有SYN标志的TCP报文。这是三次握手过程中的消息1。(2)服务器响应客户端。这是三次握手中的第二条消息。此消息同时携带ACK标志和SYN标志。因此,它代表了对客户端刚才的SYN报文的响应;同时向客户端标识SYN,询问客户端是否准备好进行数据通信。(3)客户端必须再次用ACK报文响应服务段,也就是段3,为什么要“三次握手”呢?这是因为服务器处于LISTEN状态的SOCKET在收到SYN报文的连接建立请求后,可以放ACK和SYN(ACK作为响应,SYN作为同步)。要发送的文本。但是当你关闭连接后,当你收到对方的FIN报文通知时,只代表对方没有数据可以发送给你;但你的数据还没有全部发送给对方,所以你可能不会立即关闭SOCKET。即你可能还需要给对方发送一些数据,然后再给对方发送一个FIN报文,表示同意现在关闭连接,所以这里的ACK报文和FIN报文多是分开发送的。在谢希仁的书《计算机网络》第四版中,“三次握手”的目的是“防止无效的连接请求段突然传到服务器,导致错误”。另一本经典书籍《计算机网络》中的“三次握手”的目的是为了解决“网络延迟重复包”的问题。这两种不同的表述其实说明的是同一个问题。2.连接终止协议(四波)**由于TCP连接是全双工的,所以每个方向都必须单独关闭**。原理是当一方完成自己的数据发送任务后,可以发送一个FIN来终止这个方向的连接。收到FIN只代表这个方向没有数据流,TCP连接收到FIN后仍然可以发送数据。先关闭的一方将执行主动关闭,而另一方将执行被动关闭。(1)TCP客户端发送一个FIN,关闭客户端到服务器的数据传输(报文段4)。(2)服务器收到FIN后,发回ACK,确认序号为收到的序号加1(报文5)。和SYN一样,一个FIN也会占用一个序号。(3)服务器关闭客户端连接,并向客户端发送一个FIN(报文段6)。(4)clientsegment发回ACK报文进行确认,并将确认序号设置为收到的序号加1(segment7)。为什么要“挥手四次”有人可能会有疑问,为什么在tcp连接握手的时候,ACK是和SYN一起发送的,而这里的ACK却不是和FIN一起发送的。原因是因为tcp是full-duplex模式,**当收到FIN的时候,表示不会再发送数据,但是还是可以发送数据的**。握手,挥手过程中各个状态的介绍(详见wiki:TCP)3次握手过程状态:LISTEN:这也是一个非常好理解的状态,表示服务器端的某个SOCKET是处于监听状态,可以接受连接。SYN_SENT:客户端SOCKET在执行CONNECT连接时,首先发送一个SYN报文,因此会立即进入SYN_SENT状态,等待服务器在三次握手中发送第二个报文。SYN_SENT状态表明客户端已经发送了SYN消息。(发送方)SYN_RCVD:此状态回应SYN_SENT。此状态表示已收到SYN消息。一般情况下,这个状态是服务器端建立TCP连接时SOCKET的三次握手会话过程中的一个中间状态,时间很短,基本上你很难用netstat看到这个状态,除非你专门写一个客户端测试程序,在三次TCP握手过程中故意不发送最后一个ACK报文。因此,在该状态下,收到客户端的ACK报文后,会进入ESTABLISHED状态。(Serverside)ESTABLISHED:这个很好理解,表示连接已经建立。4次挥手过程状态:(参考上图)FIN_WAIT_1:这个状态需要仔细解释一下。其实FIN_WAIT_1和FIN_WAIT_2状态的真正含义就是等待对方的FIN报文。这两种状态的区别在于,FIN_WAIT_1状态实际上是指当SOCKET处于ESTABLISHED状态时,想要主动关闭连接,向对方发送FIN报文。此时SOCKET进入FIN_WAIT_1状态。而当对方回复ACK报文后,就进入FIN_WAIT_2状态。当然,在实际正常情况下,无论对方是什么情况,都应该立即响应ACK报文,所以FIN_WAIT_1状态一般是很难看到的,而FIN_WAIT_2状态往往可以通过netstat看到。(主动方)FIN_WAIT_2:这个状态上面已经详细解释过了。FIN_WAIT_2状态下的SOCKET其实是半连接的意思,即一方请求关闭连接,同时也告诉对方我暂时还有一些数据要发给你。(ACK消息),然后稍后关闭连接。(主动方)TIME_WAIT:表示收到对方的FIN报文并发送ACK报文,等待2MSL后返回CLOSED可用状态。如果在FIN_WAIT_1状态,当收到对方同时带有FIN标志和ACK标志的报文时,可以直接进入TIME_WAIT状态,不经过FIN_WAIT_2状态。(主动方)CLOSING(比较少见):这个状态比较特殊,实际情况中应该很少见,属于比较少见的异常状态。一般情况下,当你发送FIN报文时,应该先收到(或同时收到)对方的ACK报文,然后再收到对方的FIN报文。但是CLOSING状态是指你发送完FIN报文后,并没有收到对方的ACK报文,而是收到了对方的FIN报文。在什么情况下会发生这种情况?其实仔细想想,不难得出一个结论:就是如果双方几乎同时关闭了一个SOCKET,那么就会出现双方同时发送FIN报文的情况,即会出现CLOSING状态,表示双方正在关闭SOCKET连接。CLOSE_WAIT:这个状态的意思其实就是等待关闭。你怎么理解的?当对方关闭一个SOCKET并给自己发送FIN报文时,你的系统无疑会回应一个ACK报文给对方,然后进入CLOSE_WAIT状态。接下来,您真正需要考虑的是检查您是否还有数据要发送给对方。如果没有,那么可以关闭SOCKET,向对方发送FIN报文,即关闭连接。所以在CLOSE_WAIT状态下你需要做的就是等待你关闭连接。(被动方)LAST_ACK:这个状态比较好理解。一方发送FIN报文后被动关闭,最后等待对方的ACK报文。收到ACK报文后,可以进入CLOSED可用状态。(被动端)CLOSED:表示连接中断。TCP的具体状态图可以参考:为什么连接建立协议是三次握手,而关闭连接是四次握手?这是因为服务器处于LISTEN状态的SOCKET在收到SYN报文的连接建立请求后,可以发送ACK和SYN(ACK作为响应,SYN作为同步)。但是当你关闭连接后,当你收到对方的FIN报文通知时,只代表对方没有数据可以发送给你;但你的数据还没有全部发送给对方,所以你可能不会立即关闭SOCKET。即你可能还需要给对方发送一些数据,然后再给对方发送一个FIN报文,表示同意现在关闭连接,所以这里的ACK报文和FIN报文多是分开发送的。TCP的优点:可靠、稳定。TCP的可靠性体现在TCP传输数据之前,会进行3次握手建立连接,而在传输数据时,有确认、窗口、重传、拥塞控制等机制。数据传输完成后,连接将断开。节省系统资源。TCP的缺点:速度慢,效率低,系统资源占用高,容易被攻击,TCP在传输数据前需要先建立连接,会消耗时间,数据传输时,确认机制,重传机制,拥塞控制机制等会消耗大量时间,需要在每个设备上维护所有的传输连接。实际上,每个连接都会占用系统的CPU、内存等硬件资源。IT概论感谢您的关注|练习地址:www.520mg.com/it
