Linux高性能服务器编程学习笔记——TCP协议

TCP协议

TCP服务特点

传输层协议主要有2个:TCP协议和UDP协议。TCP协议相对于UDP协议的特点是:可靠传输、面向连接、字节流
TCP连接是全双工的、一对一的,所以基于广播和多播的应用程序不能使用。
发送端执行的写操作次数和接收端执行的读操作次数之间没有任何数量关系,这就是字节流的概念。与数据报服务的区别就是通信双方是否必须执行相同次数的读、写操作。
UDP协议发送端应用程序每执行一次写操作,就将其封装成UDP数据报并发送。接收端必须及时针对每个UDP数据报执行读操作,否则就会丢包。
在这里插入图片描述
TCP传输是可靠的:

  1. 采用发送应答机制,即发送端发送的每个TCP报文段都必须得到接收方的应答,才认为报文段传输成功。
  2. 采用超时重传机制,发送端在发送出一个TCP报文段之后启动定时器,如果在定时时间内未收到应答,将重发该报文段。
  3. 对收到的报文段重排、整理,TCP报文段是以IP数据报发送的,而IP数据报到达接收端可能乱序、重复,所以TCP协议会对接收到的TCP报文段重排整理,在交付给应用层。

TCP连接的建立和关闭

三次握手

一般而言,TCP连接时通过客户端发起(特殊情况时同时打开),并通过三次握手建立的。TCP连接的关闭过程相对复杂一些,可能时客户端执行主动关闭,也可能时服务器执行主动关闭,还可能是同时关闭。
在这里插入图片描述
1. 第一个TCP报文段包含SYN标志,因此它是一个同步报文段。同时,该报文段还包含一个ISN值为535734930的序号。
2. 第二个TCP报文段也是同步报文段,表示同意建立连接。确认值是535734931,即第一个同步报文段的序号值加1。
3. 第三个TCP报文段是对第2个报文段的确认。

后面4个TCP报文段是关闭连接的过程。

1. 第一个TCP报文段包含FIN标志,因此它是一个结束报文段。结束报文段和同步报文段一样,也要占用一个序号值。
2. 第二个TCP报文段是服务器用来确认该结束报文段。
3. 第三个TCP报文段是服务器自己的结束报文段。
4. 第四个TCP报文段是客户端给予确认。

实际上,仅用于确认目的的确认报文段5是可以省略的,因为结束报文段6也包含该确认信息。

半关闭状态

TCP连接时全双工的,所以它允许两个方向的数据传输被独立关闭。换言之,通信的一端可以发送结束报文段给对方,告诉它本端已经完成了数据的发送,但允许继续接收来自对方的数据,直到对方也发送结束报文段以关闭连接。TCP连接的这种状态称为半关闭。
在这里插入图片描述

连接超时

如果客户端访问一个距离它很远的服务器,或者由于网络繁忙,导致没有应答,此时对于可靠服务的TCP来说必然要重连,如果重连无效,则通知应用程序连接超时

TCP状态转移

TCP连接的任意一端在任一时刻都处于某种状态。
在这里插入图片描述
在这里插入图片描述
TIME_WAIT状态存在的原因有两点:

  1. 可靠的终止TCP连接,例如报文段7丢失。
  2. 保证让迟来的TCP报文段有足够的时间被识别并丢弃

复位报文段

在某些特殊条件下,TCP连接的一端会向另一端发送携带RST标志的报文段,即复位报文段,已通知对方关闭连接或重新建立连接。产生复位报文段的3种情况:

  1. 访问不存在的端口
  2. 异常终止连接
  3. 处理半打开连接。服务器(客户端)关闭或者异常终止了连接,而对方没有接收到结束报文段,还维持着原来的连接,称这样的连接为半打开连接。如果客户端往处于半打开状态的连接写入数据,则对方回应复位报文段。

TCP数据

TCP报文段所携带的应用程序数据按照长度分为两种:交互数据成块数据

交互数据

交互数据仅包含很少的字节,对实时性要求高
延迟确认,即不马上确认上次收到的数据,而是在一段延迟时间后查看本端是否有数据需要发送,如果有,则和确认信息一起发出。延迟确认可以减少发送TCP报文段的数量
在广域网上交互数据流很可能导致拥塞发生,解决该问题的有效方法时Nagle算法。通信双方在任一时刻最多只能发送一个未被确认的报文段,在该TCP报文段的确认到达之前不能发送其他的TCP报文段。另一方面,发送方在等待确认的同时收集本端需要发送的微量数据,并在确认报文到来时将它们全部发出。具有适应性:确认到达的越快,数据也发送的越快。

成块数据

成块数据的长度则通常为TCP报文段允许的最大数据长度,对传输速率要求高
当传输大量大块数据的时候,发送方会连续发送多个TCP报文段(取决于窗口大小),接收方可以一次确认所有这些报文段。

带外数据

带外数据用于迅速通告对方本端发生的重要事件。因此带外数据具有更高的优先级,它应该总是立即被发送。UDP没有实现带外传输,TCP没有真正的带外数据,不过可以利用紧急指针标志和紧急指针两个字段。
紧急指针指向最后一个带外数据的下一个字节。发送端一次发送的多字节的带外数据,只有最后一字节被当作带外数据。

超时重传

TCP模块为每个TCP报文段都维护一个重传定时器,该定时器在TCP报文段第一次被发送时启动。如果超时时间内未收到接收方的应答,TCP模块将重传TCP报文段并重置定时器。

拥塞控制

TCP模块还有一个重要的任务,就是提高网络利用率,降低丢包率,并保证网络资源对每条数据流的公平性。这就是拥塞控制。主要包含四个部分:慢启动、拥塞避免、快速重传和快速恢复
拥塞控制的最终受控变量是发送端向网络一次连续写入的数据量SWND),即能连续发送的TCP报文数量。发送端要合理地选择SWND的大小,太小会引起网络延迟,太大导致网络拥塞。实际的SWND值是RWND(接收方发送的接收通道窗口)和CWND(拥塞窗口)的较小者
在这里插入图片描述
发送端判断拥塞发生的依据有以下两个:

  1. 传输超时,或者说TCP重传定时器溢出
  2. 接收到重复的确认报文段

对第一种情况仍然使用慢启动和拥塞避免。对第二种情况则使用快速重传和快速恢复。
慢启动使得CWND指数形式扩大。当CWND超过慢启动门限时,进入拥塞避免阶段。拥塞避免阶段使得CWND按照线性方式增加。
发送端如果连续收到3个重复的确认报文段,就认为拥塞发生了,启用快速重传和快速恢复,完成后拥塞控制进入拥塞避免阶段。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值