网络9. TCP/IP网络之传输层
传输层功能
分段上层数据 建立端到端连接 透明、可靠传输 流量控制
传输层协议
主要有TCP/IP协议族的TCP协议和UDP协议。
接收方负载高时,会自动控制单位时间数据量。
TCP三次握手机制
有两个中间状态,syn_sent和syn_rcvd,这两个状态叫着「半打开」状态,就是向对方招手了,但是还没来得及看到对方的点头微笑。syn_sent是主动打开方的「半打开」状态,syn_rcvd是被动打开方的「半打开」状态。客户端是主动打开方,服务器是被动打开方。 syn_sent: syn package has been sent syn_rcvd: syn package has been received
TCP数据传输,tcp链接是双工的,双方都可以主动发起数据传输。无论哪方写数据,都需要对方的确认才能认为对方收到了自己的数据。
TCP四次挥手
客户端挥手(fin)——服务端伤感地微笑(ack)——服务端挥手(fin)——客户端伤感地微笑(ack)
之所以中间的两个动作没有合并,是因为tcp存在「半关闭」状态,也就是单向关闭。客户端已经挥了手,可是还没有走,只是不再说话,但是耳朵还是可以继续听,服务端呢继续喊话。等待服务端累了,也不再说话了,服务端向客户端挥了挥手,客户端伤感地微笑了一下,才彻底结束了。非常特殊的状态time_wait,它是主动关闭的一方在回复完对方的挥手后进入的一个长期状态,这个状态标准的持续时间是4分钟,4分钟后才会进入到closed状态,释放套接字资源。不过在具体实现上这个时间是可以调整的。它就好比主动分手方要承担的责任,是你提出的要分手,你得付出代价。这个后果就是持续4分钟的time_wait状态,不能释放套接字资源(端口),就好比守寡期,这段时间内套接字资源(端口)不得回收利用。
它的作用是重传最后一个ack报文,确保对方可以收到。因为如果对方没有收到ack的话,会重传fin报文,处于time_wait状态的套接字会立即向对方重发ack报文。
同时在这段时间内,该链接在对话期间于网际路由上产生的残留报文(因为路径过于崎岖,数据报文走的时间太长,重传的报文都收到了,原始报文还在路上)传过来时,都会被立即丢弃掉。
4分钟的时间足以使得这些残留报文彻底消逝。不然当新的端口被重复利用时,这些残留报文可能会干扰新的链接。
4分钟就是2个MSL,每个MSL是2分钟。MSL就是maximium segment lifetime——最长报文寿命。这个时间是由官方RFC协议规定的。至于为什么是2个MSL而不是1个MSL,我还没有看到一个非常满意的解释。
四次挥手也并不总是四次挥手,中间的两个动作有时候是可以合并一起进行的,这个时候就成了三次挥手,主动关闭方就会从fin_wait_1状态直接进入到time_wait状态,跳过了fin_wait_2状态。