【学习】TCP可靠性体现在哪里
TCP是一种可靠的传输方式
TCP(传输控制协议)是一种最常见的网络通信协议(另一种常见的是UDP协议)。它是传输层协议中的一种,与UDP协议相比,它的 可靠性 更高,但是传输开销更大。
TCP通信为什么可靠?
1.三次握手建立连接通道
三次握手是TCP建立连接通道的方式,它确保了连接通道的可靠性。我先用一个通俗的例子来描述一下三次握手的过程
假如你在给你母亲打电话,那么必然有如下过程:
你:喂,妈~
妈:诶,在做什么呢
你:我正在学习呢
这也很像TCP三次握手的过程
1.客户端给服务器发送syn包,等待服务器应答
2.服务器收到了syn包,发送ack包应答告诉客户端我已经收到了你的消息
3.然后服务器发送syn包给客户端,等待客户端应答
4.客户端收到syn包,发送ack包告诉服务器我也收到了你的消息
然而这个过程是4步,为什么叫三次握手呢?
为了传输更加快捷,第2步跟第3步是同时进行的,也就是说服务器在返回ack包的同时也发送了syn包给客户端
这就是三次握手,参照下图可以更好理解
那么为什么说三次握手使连接通道更加可靠呢?
回到上述讲的例子,你给母亲打电话:
你:喂,妈~
妈妈:…
你没有收到你妈妈的应答,是不是可以理解为你妈妈没有收到你给他传达的消息。那么你就会再问一句:喂,妈~ ,直到你妈妈回答你的消息或者关掉通信再次拨打过去
三次握手也是如此
当客户端给服务器发送syn包,服务器接收后返回的应答ack包在传输过程中丢失了,那么客户端在一定时间没收到应答包后触发超时重传,即再给服务器发送一段报文。对于服务器端来说,发出的syn,ack包迟迟没有客户端的ack回复,会触发重传,此时服务端处于 SYN_RCVD 状态,会依次等待 3s、6s、12s 后,重新发送【syn,ack】包;而【syn,ack】的重传次数,不同操作系统有不同的配置,例如在 Linux 下可以通过tcp_synack_retries 进行配置,默认值为 5。如果这个重试次数内,仍未收到【ack】应答包,那么服务端会自动关闭这个连接。
如上图 客户端服务器相互发送的内容中,还有一段seq。它的全称是sequence number即序号。下面举个例子,来说明它的作用。还是回到给母亲打电话的例子:
你:喂,妈~
妈妈:诶,在做什么呢?
你:阿巴阿巴~
妈妈:???
你妈妈是不是就听不懂你在说什么?因为你答非所问,所以导致通信失败
TCP连接过程是需要确认通信双方信息无误的,所以
当客户端给服务器发送syn包时,对发送的数据进行了标记即seq,规定了当服务器接收到后客户端的消息,服务器返回的ack为seq+1,那么客户端就可以知道,服务器确认是收到了它的消息
即 客户端给服务器发11,服务器回应客户端12则消息确认收到,如果回复22说明消息在传输过程中有丢失,通信失败
2.TCP数据传输
三次握手建立连接后,接下来就是数据的传输了。TCP的传输过程中有确认机制和重传机制,配合流量控制和拥塞控制,使传输效率更高校可靠。
流量控制
接收端处理数据的速度是有限的,如果发送方发送数据的速度过快,导致接收端的缓冲区满,而发送方继续发送,就会造成丢包,继而引起丢包重传等一系列连锁反应。 因此TCP支持根据接收端的处理能力,来决定发送端的发送速度,这个机制叫做流量控制。在TCP报文段首部中有一个16位窗口长度,当接收端接收到发送方的数据后,在应答报文ACK中就将自身缓冲区的剩余大小,放入16窗口大小中。这个大小随数据传输情况而变,窗口越大,网络吞吐量越高,而一旦接收方发现自身的缓冲区快满了,就将窗口设置为更小的值通知发送方。如果缓冲区满,就将窗口置为0,发送方收到后就不再发送数据,但是需要定期发送一个窗口探测数据段,使接收端把窗口大小告诉发送端。
3.TCP的四次挥手
所谓四次挥手,是TCP断开连接的四个步骤
写到这,可以回看上文中三次握手的过程,我为什么将三次握手写成四步。因为四次挥手跟三次握手的过程基本相同,只是三次握手为了使传输更快将第二步与第三步合并一起发,而四次挥手则是完整的四步走。如果用通俗的语言来讲这四步就是
客户端:我要下线了
服务器:好的,等我处理完也下线
服务器:我处理完了,下线了
客户端:好的
然后关闭
关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭socket(比如程序正在执行延时函数),所以只能先回复一个ack报文,告诉客户端端,“你发的FIN报文我收到了”。只有等到服务端所有的报文都发送完了,才能发送FIN报文。因此第二步第三步不能一起发送。故需要四步握手。
看完全文,我相信你应该了解了为什么说TCP是一种可靠的传输,但其传输开销大了。笔者也在学习阶段,对其理解只是皮毛,甚至会有偏差,如果有问题可以留言指教。