tcp最重要一点是全双工:client 和server同时童话,有两个信道
1、三次握手(过程,简化三动作,中间2状态)
2、TCP 数据传输(tcp重传、互相喊话、批量ack、tcp窗口大小)
3、TCP 四次挥手(过程、没合并、time_wait、偶尔合并)
一、TCP 三次握手过程
好比在街上隔50米看见对方,因为雾霾不能100%确认,招手确定
1)C先向S招手(syn),
2)S看到C向自己招手后,向对方点头(ack)。C看到S点头确认(进入estalished状态)。
3)S还有点狐疑,有没有可能C在看别人,向C招了招手确认(syn),
C看到S向自己招手确认,也点头(ack),S确认(进入established状态)。
相互拥抱。
1、简化成三个动作:C招手--S点头微笑--S招手--C点头微笑。S连续2个动作,点头+再次招手,可合(syn+ack)。
2、两个中间状态,syn_sent和syn_rcvd,「半打开」向对方招手,还没看到对方点头微笑
syn_sent: syn package has been sent 主动 客户端
syn_rcvd: syn package has been received 被动 服务端
二、握手完成:开始TCP 数据传输
C喊话(data),S听后回复自己听见(ack)。
1、tcp重传:如半天没听到回复,重新喊话,就是。(也可能S听到,但回复被风吹走,C不用管,重传)
PS:「重传」和「去重」网络内核处理
2、可互相喊话,因为tcp链接「双工」,都收到对方确认
3、批量ack:C连说八句话,S回一句都听见了
4、TCP窗口大小:不能一次说太多,S无法消化,协商好合适发送和接受速率
ps:操作系统的网络内核,对数据包排序,保证到用户层时顺序一致
三、TCP 四次挥手
和建立链接比较类似,只不过中间两部没合成,C挥手(fin)—S伤感地微笑(ack)—S挥手(fin)—C微笑(ack)
1、没合并,是因为tcp存在「半关闭」状态,单向关闭。1)C挥了手,人还没走,不再说话,但可继续听,2)S继续喊话,累了不再说话了,朝C挥手,C伤感地微笑,才彻底结束
2、time_wait,非常特殊状态:主动关闭方C在回复完对方挥手后,进入一个长期状态,标准4分钟(可调),然后closed状态,释放套接字资源。ps:提分手,得付代价。
1)作用:重传最后一个ack报文,确保对方收到。如对方没收到ack,重传fin报文,处于time_wait状态套接字,会立即向对方重发ack报文
2)同时在这段时间内,该链接对话期间,于网际路由上产生的残留报文(因路径崎岖,数据报文走时间太长,重传报文都收到,原始报文还在路上)传过来时,被立即丢掉。4分钟足以让残留报文彻底消逝。
ps:每个MSL是2分钟(maximium segment lifetime最长报文寿命,RFC协议规定的)
3、偶尔三次挥手,中间两动作有时候可合并,主动关闭方从fin_wait_1状态直接到time_wait状态,跳过fin_wait_2状态
网友评论