TCP的三次握手和四次挥手

TCP三次握手就好比两个人在街上隔着50米看见对方,但是因为雾霾等原因不能100%确认,所以要通过招手的方式相互确定对方是否认识自己.

第一次:张三首先向李四招手(syn)

第二次:李四看到张三向自己招手后,李四微笑并招手(ack+syn),中间是两个动作的合并

第三次:张三点头(ack)

synsent是主动打开方的”半打开”状态,synrcvd是被动打开方的”半打开”状态.

TCP数据传输就是两个人隔空对话,差一点距离,所以需要对方反复确认听见了自己的话

张三喊了一句话(data),李四听见了之后要向张三回复自己听见了(ack),如果李四没回复,张三就认为李四没听见,所以需要重新喊话,这就是TCP重传.既然会重传,李四就有可能同一句话听见了两次,这就是”去重”,重传和去重工作操作系统的网络内核模块都已经帮我们处理好了,用户层是不用关心的.因为TCP链接是”双工的”,双方都可以主动发起数据传输.

张三一说连说了8句话,这时候李四可以连续听了这8句话之后,一起向对方回复说前面你说的8句话我都听见了,这就是批量ack.但张三也不能一次性说了太多话,李四的脑子短时间可能无法消化太多,两个人之间需要有协商好的合适的发送和接受速率,这个就是”TCP窗口大小”.

网络环境的数据交互之间的对话还要复杂一些,它存在数据包乱序的现象.同一个来源发出来的不同数据包在”网际路由”上可能会走过不同的路径,最终达到同一个地方时,顺序就不一样.操作系统的网络内核模块会负责对数据包进行排序,到用户时顺序就已经完全一致了.

TCP四次挥手

TCP断开连接的过程和建立连接的过程比较类似,只不过中间的两部并不总是会合成一步走,所以它分成了4个动作,张三挥手(fin)---李四伤感地微笑(ack)---李四挥手(fin)---张三伤感地微笑(ack),之所以中间的两个动作没有合并,是因为TCP存在”半关闭”状态,也就是单向关闭.张三已经挥了手,可是人还没有走,只是不再说话,但是耳朵还可以听的见,等李四累了,也不再说话了,朝张三挥了挥手,张三伤感地微笑了一下,才彻底结束.

上面有一个非常特殊的状态time_wait,它是主动关闭的一方在回复对方的挥手后进入的一个长期状态,这个状态标准的持续时间是4分钟,4分钟后才会进入到close状态,释放套接字资源.不过在具体实现上这个时间是可以调整的.它的作用是重传最后一个ack报文,确保对方可以收到.因为如果对方没有收到ack的话,会重传fin报文,处于time_wait状态的套接字会立即向对方重发ack报文.

同时在这段时间内,该链接在对话期间于网际路由上产生的残留报文(因为路径过于崎岖,数据报文走的时间太长,重传的报文都收到了,原始报文还在路上)传过来时,都会被立即丢弃掉。4分钟的时间足以使得这些残留报文彻底消逝。不然当新的端口被重复利用时,这些残留报文可能会干扰新的链接。

4分钟就是2个MSL,每个MSL是2分钟。MSL就是maximium segment lifetime——最长报文寿命。这个时间是由官方RFC协议规定的。至于为什么是2个MSL而不是1个MSL,我还没有看到一个非常满意的解释。四次挥手也并不总是四次挥手,中间的两个动作有时候是可以合并一起进行的,这个时候就成了三次挥手,主动关闭方就会从finwait1状态直接进入到timewait状态,跳过了finwait_2状态。

Socket是在应用层与传输层之间的通信

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值