Tcp连接是什么?
Tcp连接是需要先进行相关的数据的交换的,也就双方先要进行握手,也就是双方必须发送某些预备报文段来建立确保数据传输的参数,Tcp连接是端到端的且是点到点的,也就是说是双发的,中间的路由器和其他的设施是不用管的,建立的是一条全双工的一个通道。
Tcp连接是如何建立的?
在这里简单的说一下TCP连接的建立,首先客户端发送一个特殊的报文,等到服务端接收到报文后,服务端会返回一个特殊的报文给客户端,客户端此时接收到报文后,会返回一个特殊的报文给服务端,这里我们需要注意的问题在于,前两个报文是没有载荷的,最后一个报文是有载荷的。这里说的就是TCP连接的三次握手。
TCP报文段结构
这里我们将说明几个在TCP结构中比较重要的几个点
1. 序号和确认号
序号:在TCP报文传输的过程中,需要注意的点,从应用层进程中我们拿到了数据包,然后将数据交给TCP进行传输,在运输层要将数据交给网络层的时候,由于mss的限制,我们需要将数据进行拆分,拆分的每一块我们需要给他添加上TCP的头部,然后进行传输。在这里我们会给每个mss数据包进行编号,我们标号的号码也就是序号,序号是由数据在数据段中的偏移量进行命名的。
确认号:在服务端接收到数据的时候,会返回一个确认号,这个确认号的目的是为了告诉客户端,你发送的XXX-1号及之前的数据都已经接收到了,这个确认号是具有累加性的,也就是说在返回ACK=200 然后返回 ACK =300的时候,这里300就已经包含了前面的两百了,所以在确认数据传输的时候,只需要确认300就可以确认299及299以前的数据都已经接收到了
2. 超时时间的设置
在TCP中,为了传输效率的提升,我们需要设置一个超时的时间,在超过这个超时时间的时候,我们就会重新传输数据,以保证TCP传输的效率,但是呢不合理的超时时间会导致我们TCP传输效率的下降,那么我们应该如何来设置一个合适的时间呢。
我们可以看到在书上给我们说到,其实设置这个TCP的超时时间,我们需要先测量这个传输的时间来设置,对于这个时间是没有固定的,也就是说,TCP中的超时时间是动态时刻改变中的。具体的计算公式可以看书上。
可靠数据传输
TCP实现不可靠的IP协议上实现了rdt从而保证tcp传输的可靠性
1. 有趣的事情
在传输中的超时计时器,在TCP中我们可以看到,使用的是单一的重传计时器,在准备发送的时候,也就是在第一个bit打出的时候,启动计时器,如果超时了,会把最早的数据段重新传输,在超时器超时前接收到服务端发送的ack,这个时候会将被确认的数据从缓存区中删除,然后重新计时。
在ack发送的过程中可能会出现下面这个情况
这个时候因为ack的丢失导致我们的计时器的超时,这个时候我们的客户端会重新传输该数据包,然后此时服务端返回给我们ACK,这个时候因为在之前服务端就已经确认了该数据包,所以后面传输过来的数据包,TCP会选择将其丢弃。
在上图中,我们看到客户端传输了两段数据过来,然后都被接收到了,但是在ack的传输中由于导致了超时机制,导致数据包的重新传输,这里我们需要注意的点是,我们看到在超时过后这里TCP只是把最早传输的数据包进行了传输,然后后面, 我们看到接收到了重新传输的数据,这个时候返回的ack是120,这个是因为累积确认机制。
2. 超时间隔加倍
对于这里我们看得不是很懂但是知道在干嘛,这里就是在超时的时候对超时时间进行一个翻倍处理,我查了一下资料好像,这里最多进行两次翻倍处理。
3. 快速重传
快速重传机制,是在客户端重新传输了数据过后,如果服务端返回了三次一样的ack这个时候,就算没有超时,也会直接进行重传处理。
4. TCP选择的是GBN还是SR
对于这个问题,首先给出答案,这个答案就是GBN和SR的结合,我们将简单的概述一下这个重传的机制,首先TCP发出报文,如果说接收到的报文,出现了失序,那么我们会先把这个数据包缓存下来,然后继续后面的上传,同时记忆没有成功的获取的数据报文。这里我们可以结合到我们的快速重传机制。