TCP(Transmission Control Protocol )协议 相关知识与总结

参考《计算机网络 第7版》 谢希仁


TCP(运输控制协议)协议是位于运输层的协议,连接基于套接字Socket,它有以下特点。
  • TCP是面向连接的 有连接建立和释放过程,也就我们熟知的三次握手和四次挥手。
  • TCP只能进行一对一的通信,而不像同在运输层UDP,既可以一对一又可以一对多还可以多对多。
  • TCP提供可靠交付的通信服务,而UDP只提供最大努力的服务(也就是不可靠的服务)。
  • TCP提供全双工的通信,也就是说TCP连接的双方可以同时给对方发送数据,在TCP连接的双方都有一个发送缓冲区和一个接收缓冲区。
  • TCP是面向字节流的。 TCP将应用层传来的数据块看做一串字节流,并不关心这串字节流的具体含义或者字节流有多少,TCP会根据对方给出的窗口值和网络拥塞程度来对字节流进行分解为多个数据包或者合并为一个数据包。TCP只保证接收方接收到的字节流与发送发发出的字节流一致,因此应用层程序需要有识别接收到的字节流的能力。这也会带来粘包的问题,即应用层无法只看到了运输层传来的字节流,但不知道该从哪将字节流分开,这就是粘包问题。


1.首部
 

TCP首部

  • 源端口和目的端口 - 写入源端口号和目的源端口号
  • 序号 - TCP是面向字节的,在数据传输过程中会为每一个字节编号,这样在接收方接收时才不会发生混乱,TCP首部中的序号是本报文段发送数据的第一个字节的编号。
  • 确认号 期望收到对方的下一个报文段的第一个字节的数据序号。
  • 数据偏移 表明TCP的首部的长度,因为首部长度是不确定的(有选项这一可变部分),因此需要在TCP首部固定的部分告诉接收方我们发送的数据从哪里开始。
  • 窗口 指本方的接受窗口的大小,这个值的大小是根据对方的需要设置的
  • 检验和 用于差错检验
  • ACK 表明该报文是确认报文,ACK为1时,确认号才有效
  • SYN 同步报文,在建立连接时会用到
  • FIN 终止报文,在TCP释放连接时会用到
  • 常用的就这些,其它的大家有兴趣可以自己了解

2.滑动窗口

滑动窗口是以字节为单位的。滑动窗口就是一个可发送字节大小限制。对于处于滑动窗口内的字节,发送发可以在没有接受到接收方的ACK的情况下继续发送位于窗口内的其他字节。滑动的意思其实就是它这个范围是可以动的,即收到确认的字节可以移出滑动窗口,而窗口的另一侧可以向前移动,有点像滑动的意思,这样说可能不好理解,但是配合图片去理解并不难理解。
在这里插入图片描述
如果出现了丢包情况,就可能需要发送方去重传,这个过程叫做超时重传。
对于滑动窗口内的字节,接收方可以累积一定数量后再发送ack,比如下面的图,接收方可以在收到41后再给发送方发送确认号为42ack包,如果这个包丢了,影响不大,可以在后续的发送中发送42之后的确认包,比如发送48的,就表明48以前的接收方都收到了,现在需要发送方发送48这个包。
在这里插入图片描述
而如果出现下面这种情况就需要进行超时重传。
在这里插入图片描述
出现这种情况可能是因为数据包丢失了,也有可能是ack丢失了,但是只要发生这种情况发送方就需要开始计时,如果一定时间内没有收到接收方的ack那么就会认为接收方并没有接收到发送方的数据包,也就是会进行超时重传。


3.超时重传

TCP的发送方在规定的时间内没有接收到接收方的确认就从上一次ack的地方重新发送,具体的等待时间根据不同的网络会不相同,具体的计算就像是一个经验值,会根据以往的RTT等信息来确定,这里就不贴公式了。


4.选择确认SACK

选择确认就是确认一块小窗口,也就是确认一个范围。确认一个范围需要8个字节(左边界序号- -有边界序号,序号是32位的,即4字节)。使用选择确认需要占用TCP首部中的选项的位置,TCP选项最大我40字节,也就是说可能确认5个范围,但是因为还要在选项中指明使用了SACK以及SACK确认的范围的个数,因此最多只能选择确认4个范围。
在这里插入图片描述


5.流量控制

流量控制是控制发送方和接收方之间的传输速率的,双方可以告诉对方自己现在处理数据的速度,让对方选择合适的速率来给自己传送数据。而拥塞控制是对整个网络流量的控制。
流量控制是基于滑动窗口的,在TCP首部里可以设置对方的窗口多大,从而限制对方发送的速度(对方发送能力很强,一口气就把窗口里的发送完了,而接收方接收能力弱,如果窗口太大,那么就会有很多字节无法接收而产生一些问题,通过设置窗口可以限制这个字节数)。
在这里插入图片描述


6.拥塞控制

拥塞控制主要是为了防止网络负载过大而出现拥塞。网络的吞吐量随着网络的负载会先提高后降低(这个很好理解,负载太大直接瘫痪了还有什么吞吐量)。
在这里插入图片描述
TCP拥塞控制的方法有四种,慢开始、拥塞避免、快重传与快恢复。
在这里插入图片描述

  • 慢开始 就是开始设置拥塞窗口值比较小,每收到一个ack,窗口就加1。上面的图中对应的是传输轮次0-4的情况,开始为1,收到1个ack变为2,然后收到2个ack变为4(收到1个+1,最终为4)。当网络出现拥塞时才会发生慢开始,对应图中12-13,也就是’回到了最初的起点’,又从那个初值开始执行慢开始。
  • 拥塞避免 当拥塞窗口到达一定的大小后就不能再以指数的形式扩大,而是每次扩大1
  • 快重传和快恢复 对应图中的④和⑤,网络中有时并不是出现了拥塞,而是因为其他情况而导致确认丢失,这时采用慢开始会降低效率,所以就出现了快重传和快恢复,快重传就是接受方不能等待自己发送数据的时候捎带确认,而是立即确认,如果没有收到发送方的确认,就连续发送重复ack给发送方,如果发送方一连接受到3个重复的ack,就启用快恢复,快恢复如上图所示。
    在这里插入图片描述

7.连接管理

即三次握手和四次挥手过程。

  • 三次握手
    在这里插入图片描述
    为什么是三次握手?因为三次握手可以确认需要建立连接的双方能够正确的建立连接。
    第一次握手:接受方知道发送方给接收方发送信息的功能是正常的
    第二次握手:发送方知道接收方能接受到自己的信息而且发送方能给自己发送信息
    第三次握手:接收方知道了发送方能接受到自己的信息。
    三次握手后,发送方和接受方都确保对方能正常的和自己通信。除此之外还有一些其他原因。
    如果两次握手就建立连接,当发送方给接收方发送了一个SYN,而因为网络的原因,该消息过了很久才到达接收方,而在这个过程中,发送方超时重新发送SYN给接收方,并且接受方确认了这次连接,它们建立了连接,并且服务完释放了连接,这之后刚才发送方最初发送的SYN才到达接收方,此时接收方单方面的认为连接已经建立,就会白白的浪费资源。

  • 四次挥手

在这里插入图片描述
挥手过程需要保证双方的信息都已经发送完毕,因此需要四次挥手。前两次挥手表明客户端已经发送完所有数据,并且服务器也知道了客户端已经发送完了,此时客户端只需要被动的接受了,当服务器也发送完时,就会告知客户端自己发送完,此时发送方发送确认给服务器,让服务器结束这次连接。
四次挥手需要注意的是客户端在收到服务器的FIN后,还会要等待一个TIME-WAIT过程。

  • 第一,保证客户端发送的最后一个ACK能够到达服务器,因为这个ACK可能丢失,服务器看来,已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。
  • 第二,防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值