TCP三次握手和四次挥手

https://blog.csdn.net/htyurencaotang/article/details/11569905
在这里插入图片描述在这里插入图片描述
TCP是面向连接的,在传输报文段之前先要建立连接。发起连接请求的一方叫客户端,想要连接请求的一方叫服务端。

三次握手

第一次握手:
客户端向服务端发送请求连接报文(SYN);其中报头控制位SYN=1,初始序号seq=x。并进入同步已发送状态(SYN_SENT),等待服务器确认;
第二次握手:
服务端收请求连接报文(SYN)后,向客户端发送确认报文(SYN+ACK包)。确认报文段的首部中,ACK=1、SYN=1。确认序号:ack=x+1,同时为自己选择一个初始序号seq=y。此时,服务器进入同步收到状态(SYN_RCVD);
第三次握手:
客户端收到服务器的确认报文(SYN+ACK包)后,还要再向服务端发送一个确认报文(ACK)。该确认报文段首部中,ACK=1,确认号是ack=y+1,自己的序列号是seq=x+1。此包发送完毕,客户端进入已建立连接状态(ESTABLISHED),服务端收到确认报文后,也进入ESTABLISHED状态。
至此TCP连接建立。
三次握手过程中传送的包里不携带数据。三次握手完毕后,客户端与服务端才正式开始传输数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。

四次挥手

断开一个TCP连接则需要“四次挥手”。
此处,客户端——主动关闭方,服务端——被动关闭方。
第一次挥手:
此时两端还都处于ESTABLISHED状态,客户端停止发送数据,并发送一个请求断开连接报文(FIN),进入FIN-WAIT-1(终止等待-1)状态。
该报文首部中,FIN=1,序列号seq=u。
也就是告诉服务端,我的数据发送完了,不会再给你发数据了。
(另,在FIN包发送之前发送出去的数据,如果没有收到服务端对应的ACK确认报文,主动关闭方依然会重发这些数据);此时,客户端还可以接受数据。
第二次挥手:
服务端收到请求断开连接报文(FIN)后,回复确认报文(ACK),确认号:ack=u+1,序列号seq=v。此时服务端进入CLOSE_WAIT(关闭等待)状态。
客户端收到确认报文(ACK)后,进入FIN-WAIT-2(终止等待-2)状态。
现在TCP连接处于半开半闭状态,服务端如果继续发送数据,客户端依然接收。
第三次挥手:
服务端发送一个请求断开连接报文(FIN)。该报文段首部中,FIN=1,ACK=1,确认序列号ack=u+1,序列号seq=w。
就是告诉客户端,我的数据也发送完了,不会再给你发数据了,进入到最后确认状态。
第四次挥手:
客户端收到确认断开连接报文(ACK、FIN)后,回复确认报文(ACK)给服务端。
确认序号ack=w+1。序列号=u+1。
然后进入TIME_WAIT(时间等待)状态。

注意:
此时,TCP连接还没有被释放,必须经过时间等待计时器设置的时间2MSL(最长报文段寿命)后,客户端才会进入关闭状态,服务端只要收到了客户端发出的确认,也会正常进入到关闭状态,至此TCP连接释放。
为什么要设置时间等待?
1、最后一个确认报文可能会丢失,而需要重传。
2、使本连接持续时间内所产生的所有的报文段都从网络中消失,下一个新的连接中不会出现旧的连接请求报文段。

三次握手:
A:“喂,你听得到吗?”A->SYN_SEND
B:“我听得到呀,你听得到我吗?”应答与请求同时发出 B->SYN_RCVD | A->ESTABLISHED
A:“我能听到你,今天balabala……”B->ESTABLISHED
四次挥手:
A:“喂,我不说了。”A->FIN_WAIT1
B:“我知道了。等下,上一句还没说完。Balabala……”B->CLOSE_WAIT | A->FIN_WAIT2
B:”好了,说完了,我也不说了。”B->LAST_ACK
A:”我知道了。”A->TIME_WAIT | B->CLOSED
A等待2MSL,保证B收到了消息,否则重说一次”我知道了”,A->CLOSED

SYN:代表请求创建连接,所以在三次握手中前两次要SYN=1,表示这两次用于建立连接,至于第三次什么用,在疑问三里解答。
FIN:表示请求关闭连接,在四次分手时,我们发现FIN发了两遍。这是因为TCP的连接是双向的,所以一次FIN只能关闭一个方向。
ACK:代表确认接受,从上面可以发现,不管是三次握手还是四次分手,在回应的时候都会加上ACK=1,表示消息接收到了,并且在建立连接以后的发送数据时,都需加上ACK=1,来表示数据接收成功。
seq:序列号,当发送一个数据时,数据是被拆成多个数据包来发送,序列号就是对每个数据包进行编号,这样接受方才能对数据包进行再次拼接。
初始序列号是随机生成的,这样不一样的数据拆包解包就不会连接错了。(例如:两个数据都被拆成1,2,3和一个数据是1,2,3一个是101,102,103,很明显后者不会连接错误)
ack:这个代表下一个数据包的编号,这也就是为什么第二请求时,ack是seq+1,

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值