TCP 协议 三次握手 四次挥手 数据传输

来源:互联网 发布:linux git简明教程 编辑:程序博客网 时间:2024/05/17 21:47

前言:
最近一段时间接触了websocket这种双工通信机制, 对于之前的完全使用http请求的我造成了一定的冲击,相关内容就不详述了,在代码逻辑上的一些编写也开始考虑更多的问题了,想了想,我想从TCP这种通信协议上入手,于是,又捡起来了原来丢弃的书,至于为什么丢弃,当然是,写的那么抽象,我只要背一遍里面的理念就好了,其他的根本看不懂。废话不多说,现在开始

TCP:三次握手(建立通信)

为什么要三次握手
在一次沟通过程中,当然是要两方的,我们就来甲乙好了
甲说:HI!
乙如果没听到,或者中途断了,那么乙根本不知道甲要和他沟通
甲也不知道乙没有听到 所以一次握手是不行的

甲说:hi!
乙说:hi!
同样的,甲知道乙收到了,但是乙不知道甲收到没有,只是单向的建立了连接

那么四次呢,甲2次知道了乙收到了,这就多余了,浪费网络资源

这就是为什么要3次握手

那么TCP发了些什么呢
甲:hi!我要建立连接,这是我发的第1个信息10001
乙:Hi,我收到了你的连接请求,这是我发的第1个信息 20002,你的验证信息是10002
甲:好的,我收到了,你的验证信息是20003

这里的发的第1个信息就相当于SYN seq=10001
乙收到后返回一个自己的SYN seq=20002 然后验证信息相当于ACK 这个ACK的内容就是发的第1个信息加1
甲收到后返回一个验证信息 是乙发过来的SYN seq=20002 +1 ACK=20003

TCP:数据传输

甲:我要传数据了 seq=10002 ACK=20003
乙:我收到了 ACK=20004

TCP:四次挥手(断开通信)

为什么要四次挥手

用2次挥手断开其中一边连接,用另外2次挥手断开另一边的连接,最终完成整个连接关闭。
之所以这样设计是因为有可能某一边数据还未传输完,连接还未关闭

甲:我要断开连接了 FIN seq=10003 ACK=20003
乙:我收到了 ACK=10004
乙:我要断开连接了 FIN seq= 20003
甲:我收到了 ACK=20004

这里的SYN ACK FIN 都是标识位
seq an 是数据包序列号

SYN=1, ACK=0, SEQ=200 的意思是:发送的为一个SYN请求,发送端的初始数据包序号为200
SYN=1, ACK=1, SEQ=4800, AN=201 的意思是:接收端的确认信息,且接收端的初始数据包序号为4800

原创粉丝点击