TCP协议

与UDP协议相比,TCP最大的特性是实现了可靠传输。

与UDP相比,TCP最大的特性是实现了可靠传输。,这也是TCP协议的核心。

可靠传输:不是说数据能够百分百到达对面,而是说发送方在发送数据后能够知道接收方是否接收到了数据,如果没有接到,那么发送方会进行重传数据等一系列补救措施。相比与UDP来说,UDP只管发送,它不管对方接没接到数据,UDP这种做法提高了速率,而TCP保证了数据的可靠性。

TCP的很多机制保证了这种可靠传输。

1.确认应答

这是理想中数据的传输情况,但实际上网络传输可能会出现先发后至(数据传输的路径选择不一样),比如应答2先到达,那么发送方怎么判断是对哪一条消息的应答呢。

TCP中就引入了确认序号。

确认号:当此时的数据包是一个应答报文,确认号就会生效,它会描述自己收到了那些消息,当接收方把应答报文返回给发送方时,发送方就知道了自己那些数据已经成功发出去了。

那这个序列号又是什么:序列号:是一个整数,描述了数据的先后关系。

实际TCP是面向字节流的,也就是说数据以字节为单位进行数据传输。

(假设从序号1开始传输)。

如果一个TCP数据报是1000个字节,那么传输的时候就在序列位写上序列号1,1001,2001.......

如果主机B接收到1~1000的数据,就会在确认序列位上写上序列号1001(可以理解为索要下一段数据),接收到1001~2000的数据,确认序列号就是2001......。

如何区分一个数据包是普通的数据,还是确认应答数据?看标志位中的ACK

如果ACK=1,则是应答报文,为0则不是应答报文。

注意:确认应答是实现TCP可靠传输最核心的机制(加上其他机制为辅)。

2.超时重传

在网络传输过程中,可能会出现数据丢失。

(1)发送方的数据丢失,接收方没收到数据

(2)接收方发回去的确认应答丢失

无论是上述哪种情况,发送方都接收不到确认应答,而且无法区分是数据丢了,还是确认应答丢了。此时发送方就会重传数据。(发送方在发送数据后,会有一定的等待时间,如果在这个时间内没有收到确认应答,就会触发数据重传)。

对于(1),是数据没发出去,那么只要重发数据就好了,对于(2),发送方在没有收到确认应答后重传数据,那么接收方就会收到一模一样的数据,针对这种情况,TCP会有一个“接收缓冲区”,会保存已经收到的数据和它的序号,当再次收到一模一样的数据时,就会丢弃后面来的数据。这个接收缓冲区不仅可以去重,还可以对数据进行排序。确保发送到数据顺序和应用程序读取的顺序是一样的。

3连接管理(三次握手,四次挥手)

三次握手(建立连接)

TCP在建立连接时,发送方和接收方会相互打招呼三次,完成连接建立。打招呼就是给对方发一个数据包(没有实际意义的数据,就是为了引起对方注意)

A发起连接(一般发起连接的是客户端),给B发送syn,B发送回一个ack,并且也要发送一个syn,A再返回一个ack.实际上第二次和第三次握手可以合并成一个数据包(效率更高一点)。

总结一下三次握手的核心作用

1通过三次握手可以确认网络情况是否畅通。

2双方都发送一个syn和ack应答,可以确认自身的发送能力和接受能力是否正常。

3双方通过握手操作可以进行一些信息的协商(发送的数据包没有业务数据,但是还是可以发送一些数据进行沟通的),比如数据序列号从几开始等等。

四次挥手(断开连接)

建立连接一般是客户端主动发起,而断开连接可以是客户端也可以是服务端。

断开连接的过程:

想要断开连接的一方A发起起一个FIN(结束报文段)给B,B返回一个确认字段,B再发起一个FIN,A收到后再返回一个确认应答ACK。

注意第二次的ACK与第三次的FIN只有在延时应答机制(延长返回ACK的时间)下才有可能合并在一起。因为ACK应答是操作系统内核完成的,一收到FIN,内核会立即返回ACK应答,而FIN需要代码调用close方法(可能就慢很多)。

状态图:

这里的TIME_WAIT,是指A在返回ACK后,等待一定的时间再close,如果ACK丢了,那么B会重传FIN。如果A不等待已经close,那么B的重传FIN就没有响应。这里的等待时间一般是网络上两个节点通信消耗时间的两倍。

4.滑动窗口

前面三个机制都是保证TCP的可靠性,而可靠性会带来效率低影响,想数据重传,等待时间,都会降低效率,滑动窗口机制就是为了降低这样的影响。

如果一次传输一个数据,等收到应答后再传输下一个数据,这样的等待时间是比较长的,引入批量传输,一次传输一定量的数据,达到上限之后再统一等待ACK。

:批量传输

这个最大数据量成为“窗口大小”。

A发出四条数据,需要收到四个ACK此时窗口已满,待每收到一个ACK,就会立刻发出下一个数据

,看起来就像是在“滑动”。提高了效率。

丢包情况:

(1)ACK丢失

不需要重传。因为后续的ACK中通过确认序号,就可以知道前面的数据已经收到了。

(2)数据包丢失

假如数据1001-2000丢失,那么B后续不管收到的数据是多少,确认应答都会返回1001-2000,索要这个数据,至到A重传1001-2000。此时B就会恢复下一步的确认应答。

主语:滑动窗口并不是越大越好,有时候滑动窗口过大,接收方处理不过来,反而会出现一系列状况,拉低可靠性,就得不偿失。

5.流量控制

站在接收方的角度,控制发送方的发送速率。

接收方收到数据后,会放在数据缓冲区,每处理一份数据,缓冲区就会释放一份空间,而接收方每次返回ACK的时候,会把剩余缓冲区大小放在ACK里,返回给发送方。

就是这个16位窗口大小。这个大小最大不一定是64k,TCP报头的选项中有一个扩展因子,会扩大窗口数值大小。

当接收方的接收缓冲区已满,剩余空间大小为0,而且没来得及处理数据的时候,发送方就会暂停发送,当然不会暂停很久,在暂停的时候发送方会发送一些探测包(不携带业务数据)去探测对方的剩余缓冲区空间大小。

6.拥塞控制

流量控制它是考虑接收方的接受能力。而拥塞控制是站在整个通信过程的全局,考虑每一个中间节点的处理情况。

就像“木桶原理“。那么中间这么多复杂的节点传输,是无法直接去量化每一个节点的传输能力的,这时候就要进行试探,发送数据从一个较小的数据量(窗口)先缓慢发送,如果传输十分顺利,再不断增长这个数据量。如果达到了某个值,开始丢包,那么就要调小发送的数据量,重新进行这个过程。

经典版本的拥塞控制:(从网上找的图,好糊)

刚开始的数据会发送的很慢(慢开始),然后会以指数增长,达到阈值后变成线性,当遇到网络拥塞(出现丢包),会根据当前的网络情况去重新计算阈值。

##流量控制和拥塞控制都是针对发送方窗口大小,最终大小应取两者较小值。

7.延时应答

就是延时返回ACK,这时候接收方就可以趁这个时间处理更多的数据,到时候返回的剩余缓冲区空间大小就会更大。前面的四次挥手可以合并成三次的时机也是延时应答。提高了传输效率。

8.捎带应答

捎带应答是在延时应答的基础上,进一步的提高效率。

网络通信中往往是一问一答这种模型,我们知道ack是操作系统内核立即返回的,response是写代码来返回,引入了延时应答机制后,ack会延时返回,此时计算好response,要返回时,把刚才的ack捎带上,就能两条数据合并成一条,提高了效率。

9.面向字节流

由于TCP是面向字节流的,此时就会出现粘包问题。

数据报到达B的接受缓冲区后,字节字节之间紧紧挨在一起,此时B区分不出来从哪到哪是一个完整的数据包。

相比之下UDP就没有这样的问题,UDP是面向数据报的,每个DatagramPacket都是完整的。

如何解决粘包问题

核心:通过定义应用层协议,区别开数据包的边界。

1引用分隔符

每个数据包后面可以加一个\n,这样再读取数据时读到\n就知道前面的是一个完整的数据包。

2引入长度

数据包前面加上长度,这样在读取的时候,先读到长度,就知道后面应该读几个字节就停止。

10.异常情况处理

(1)进程崩溃

此时相当于调用close方法,会进行正常的四次挥手过程。因为TCP可以独立于进程存在,进程小时,TCP连接不一定消失。

(2)主机关机

进行关机时,相当于(1),触发FIN,如果在没收到对方的ACK和FIN前系统关闭,那么对方会进行重传,重传几次没收到回复,就会放弃连接。

(3)主机掉电

掉电是一瞬间的,如果是接收方掉电,那么发送方收不到ACK,就会触发超时重传,触发TCP重置连接,发送方会发送一个复位报文段,如果还是没有响应,就会释放连接。

标志位RST为1时,代表就是一个复位报文。

如果是发送方掉电,接收方收不到数据,此时就会触发心跳包机制,就是会给对方周期性发一些不带业务数据的数据包,如果重复多次,对方还是没有返回对心跳包的应答,就会释放连接。

(4)网线断开

网线一旦断开,发送方收不到ACK,就会触发超时重传,触发TCP重置连接,发送方会发送一个复位报文段,如果还是没有响应,就会释放连接。同样,接收方会触发心跳包机制。

  • 20
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值