hello,朋友们。今天咱们分享一下TCP连接建立与释放问题(三次握手与四次挥手问题)
1.简单介绍 基础知识了解(仅代表个人简单理解)
SYN 同步(一个信号 代表自己的状态)
FIN 终止(一个信号 代表自己的状态)
seq 报文段序号
ACK 确认(一个信号 代表自己的状态)
ack 确认号(我想要的 我所接收到的报文段的 下一个报文段的初始位置)
2.TCP连接的建立(我们也叫它三次握手)
在客户端与服务器建立连接之时:
客户端要先将自身信号发送给服务器
其次服务器要反馈给客户端我已接受到的简单信号
最后服务器要等待客户端的回应
从而建立连接完成
下边是原理
举个例子:
A与B ,A给B了一封信 , B收到了 , 但是A并不知道B是否收到,
B要写一封回信告诉A 我已经收到 ,但是回信发出了B并不知道A 是否接收到,
所以A要再给B写一封信 而这三封信就相当于这三次招手,从而AB确定了联系
现在客户端与服务器之间的关系已经明确了我们要知道这”三封信”中写的都是什么:
信封一:
SYN=1 (我们建立链接吧)(大致意思可以理解为 收到信后提醒一下 )
seq=0(在此:0无任何意义 只是一个简单的报文段的名称)(seq发送的是一段报文段)
信封二:
SYN=1 (你请求了 我也要请求“我们建立链接吧”)(同上)
ACK=1 (我收到你发送的了)(我收到你的信了)
seq=0(在此处:0仍无意义 只是个名称)(seq表示我发送的报文段序号)
ack=0+1 (我所想请求的报文段的初始位置,这个是根据第一封信中的seq来确定的)
信封三:
ACK=1(我收到了)
ack=0+1(我所想接受的下一个报文段的初始位置,由第二封信的seq确定)
seq=1 (我看到你发送的ack 想要的 给你发送了新的报文段)
自此TCP连接的建立已完成(三次握手完成)
3.TCP连接的释放(我们也叫它四次挥手)
客户端与服务器连接释放之时:
客户端发送给服务器断开信号
服务器返回我收到
服务器发送给客户端断开信号
客户端返回我收到
自此TCP连接释放
简单的小故事帮你理解:(有点扎心但是连接释放确实是这样的过程)
A与B是情侣 A说分手吧 B返回一个信号说我收到了
B思索之后说 分就分 A说好我知道了
第一次挥手:
FIN代表分手信号 seq代表随机信息
第二次挥手:
ACK(我知道了)seq(我发个报文段)ack(我想收到下一段的开头)
第三次挥手:
FIN (分手) ACK(我知道了) seq(我发的报文段) ack(我想要的下一个开头)
第四次挥手:
ACK(知道了)seq(我给你你想要的) ack(我想要的下一个开头)
自此四次挥手结束
为什么四次挥手不呢们能改为三次?
是因为在客户端请求断开时(客户端发送端->服务器接收端),服务器可能还有数据未发完,所以需要分开操作:
- 先同意客户端关闭连接,客户端无法传输新请求的数据;(第二次挥手) (对方没法发送新的请求但是可以对服务器的请求反馈)
- 若服务器还有数据未发送完,接着发送直至全部发送完毕;(二次 三次 挥手的间隔)
- 发送完毕后请求自身关闭连接;(第三次挥手)