TCP三次握手真能保证可靠性传输? | 七日打卡

952 阅读6分钟

前言

TCP三次握手能保证可靠性传输?

为什么要三次握手?二次或者五次行不行?

TCP三握手过程中交换了什么?真的只是单纯握个手?~_~

TCP如何保障可靠性传输?

先简单说说三次握手的过程

以前我经常想我们网络是如何保障可靠性传输?每次看计算机网络的书都有一种我懂了,我不懂,我懂了,我好像又不懂了。

三次握手,直接上例子吧!

简单版:

you:在吗?

AA:在的。

you:那让我们开始聊天吧,聊个天翻地覆。(建立连接,开始通信。)

进阶版:

you:在吗女神?我喜欢你,你喜欢我吗?(syn=1,seq=x)

女神:在的,接受到喜欢,我也喜欢你。(syn=1,ack=1,seq=y,ack=x+1)

you:好吧!让我们策马奔腾共享人生繁华。(建立连接,开始通信。)

补个图

掉头发版:

you:在吗女神?我喜欢你,你喜欢我吗?我一个月最多赚三千,但我只能给你一千。我每次最多只能花250。(syn=1,seq=x,MSS,接收窗口大小)

女神:在的,接受到喜欢,我也喜欢你。我一个月最多赚3千,但我只能给你二千。我每次最多只能花500,确定要养我?。(syn=1,ack=1,seq=y,ack=x+1,MSS,接收窗口大小)

you:弱水三千,只取一瓢饮,繁华三千,只为一人饮尽悲欢。(建立连接,开始通信。)

还有 MTU 最大传输单元和socket接受和发送缓存区的大小等。(真掉头发)

TCP报文段的首部格式

只有部分报文字段解析。

同步 SYN :

同步SYN (Synchronization) 在连接建立时用来同步序号。当SYN = 1而ACK= 0时,表明这是一个连接请求报文段。 对方若同意建立连接,则应在响应的报文段中使SYN = 1和ACK = 1。因此,SYN置为1就表示这是一个连接请求或连接接受报文。关于连接的建立和释放。

序号 seq:

sequence,第一个字节的编号随机产生。

确认位 ACK :

仅当ACK = 1时确认号字段才有效。当ACK = 0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置1。

接收窗口:

占2字节。窗口值是[0, 216 - 1]之间的整数。窗口指的是发送本报文段的一方的接收窗口(而不是自己的发送窗口)。 窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。 总之,窗口值作为接收方让发送方设置其发送窗口的依据。

为什么要三次握手?二次或者五次行不行?

答:为了保障双方是在线的,且通信正常。从而有一个可靠的通信通道。那么二次行吗?缺少了女神的答复答应,你强行连接,很有可能就是一个拉黑的结果,或者女神不在线了呢,那也是竹篮打水。那五次呢? 这个倒是没有问题,只是有点多余了。超过三次都是多余的。频繁给别人发,好的,我们开始通信。不干点其他的,也不好吧。_

TCP三握手过程中交换了什么?真的只是单纯握个手?_`

答:syn,seq,ack,mss,接收窗口大小,MTU最大传输单元和socket接受和发送缓存区的大小等。

TCP三次握手能保证可靠性传输?

答:不能,握手只是提供一个可靠通信的通道。还是得靠其他协议。下面说吧。

TCP可靠传输的实现

在网络数据传输过程中,可能存在各种各样的网络问题。比如接收方没反馈,分组丢失,数据错乱,节点处理数据超时,服务器无响应等,这个时候可靠的传输协议就至关重要了。比如图下:

在TCP可靠传输方面,主要采用以下几个机制:

•字节编号机制•

TCP数据段以字节为单位对数据段中的“数据”部分进行一一编号,确保每个字节的数据都可以有序传送和接收。

•数据段确认机制•

TCP要求每接收一个数据段都必须由接收端向发送端返回一个确认数据段(可以用一个确认数据段一次确认前面多个数据段), 其中的“确认号”表明了接收端已正确接收的数据段序号(“确认号”前面的所有数据段)。

•超时重传机制•

在TCP中有一个重传定时器(Retransmission Timer,RTT),在发送一个数据段的同时也启动了该定时器。 如果在定时器过期之前该数据段还没有被对方确认的话,则定时器停止,然后重传对应序号的数据段。

•选择性确认(Selective ACK,SACK)机制•

在SACK支持下,仅可以重传缺少部分的数据,而不会重传那些已正确接收的数据。以上所说的“字节编号机制”比较好理解, 因为是按字节进行编号的,所以接收端根据所接收到的数据段中的序号就可知道前面是否还有数据没接收到,数据可以按顺序向应用进程提交, 在对经过了数据段的数据进行重组时也可以根据这个序号进行正确的重组。

•差错检测•

首先,需要一种机制以使接收方检测到何时出现了比特差错。 常见的有奇偶校验码(PCC)和循环冗余校验(CRC)。这些技术使接收方可以检测并可能纠正分组中的 比特差错。此刻, 我们只需知道这些技术要求有额外的比特(除了待发送的初始 数据比特之外的比特)从发送方发送到接收方; 这些比特将被汇集在rdt2.0数据 分组的分组检验和字段中。

•流量控制•

滑动窗口协议实现流量控制一般说来,我们总是希望数据传输得更快一些。 但如果发送方把数据发送得过快,接收方就可能来不及接收,这就会造成数据的丢失。 所谓流量控制(flow control)就是让发送方的发送速率不要太快,要让接收方来得及接收。 利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制。

参考

《计算机网络》

《计算机网络:自顶向下方法》

《深入了解计算机网络》

车小胖的回答 www.zhihu.com/question/48…

总结

本人知识有限,如有描述错误之处,愿虎正。

你看这个像不像你欠我的赞。 谢谢大家。

你的赞就像冬日暖阳,温暖心窝。