TCP三次握手

(1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
(2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
(3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
TCP作为可靠的协议,其可靠性依赖的就是ACK确认。A向B发送了一个TCP报文,B便要回复一个ACK确认,当A向B发送的数据包丢失时或B向A发送的ACK丢失,发送方在超时时间内未收到对方发来的ACK,发送方会一直周期性的重传数据包,直到收到ACK为止、或者达到重传上限重新建立TCP链接。
建立连接、数据传输、断开链接需要ACK确认。
RST报文、裸ACK报文不需要ACK确认
RST报文不需要ACK确认主机A发送完RST报文之后,操作系统会将和该TCP链接有关的内存全部释放。 若B收到了RST报文,也会释放相关内存。 若B未收到RST报文,可能会继续发送让接收方弹射出Reset报文的报文,到最后对方一样会收到重置报文,并最终释放内存。
ACK报文不需要ACK确认 收到没有携带任何数据的ACK报文不需要返回确认,否则会产生死循环。
数据包的组装由操作系统完成,组装完毕后交由报文中的目标端口,监听该端口的进程提取数据。
TCP四次挥手

(1)PC1向PC2发送一个断开链接的数据包
(2)PC2回应PC1一个确认位=1的数据包
(3)PC2向PC1发送一个断开链接的数据包
(4)PC1向PC2回应一个确认位=1的数据包
从这四个步骤可以看出四次挥手和三次握手是大同小异的,四次挥手是将三次握手中的第二次握手分解成了两步,便有了四次挥手。
四次挥手为什么要将PC2的动作拆分成两步?
因为在四次挥手中有个半关闭概念,TCP一方(通常是客户端)可以终止发送数据,但任然可以接受数据,称之为半关闭
客户端向服务器发送FIN报文,半关闭这个链接;服务器回应ACK确认,接受半关闭
服务器继续发送数据,客户端只回复ACK确认,不在发送任何数据
当服务器发送完所有数据后,发送FIN报文段,客户端回应ACK确认,彻底关闭这个链接。
为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
有半断开的概念,服务端申请断开连接,发出报文之后,要等到对面发送收到和确定断开。
tcp协议建立连接和断开连接过程
本文详细介绍了TCP的三次握手过程,包括客户端发送SYN请求,服务器响应SYN+ACK,以及客户端发送ACK确认连接建立。同时,解释了TCP的四次挥手断开连接,涉及FIN报文、半关闭状态以及为何断开需要四次交互的原因。
3万+

被折叠的 条评论
为什么被折叠?



