计算机网络——TCP协议

一、TCP协议的特点

  TCP协议是在不可靠的IP层之上实现的可靠传输的数据传输协议,它主要解决传输的可靠、有序、无丢失和不重复问题。主要特点如下:

  1. TCP是面向连接的传输层协议。
  2. 每条TCP连接只能有2个断点,每条TCP连接只能是点对点的。
  3. TCP提供可靠的交互服务,保证传送的数据无差错、不丢失、不重复且有序。
  4. TCP提供全双工通信,允许通信双方的应用进程在任何时候都能发送数据,为此TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。
  5. TCP是面向字节流的。
二、TCP报文

  TCP传送的数据单元称为报文段,既可以运载数据,也可以用来建立连接、释放连接和应答。
在这里插入图片描述
常用字段意义如下:
TCP源端口(Source Port):源计算机上的应用程序的端口号。

TCP目的端口(Destination Port):目标计算机的应用程序端口号。

TCP序列号(Sequence Number):它表示本报文段所发送数据的第一个字节的编号。

TCP 确认号(Acknowledgment Number,ACK Number):它表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。其值是接收计算机即将接收到的下一个序列号,也就是下一个接收到的字节的序列号加1。

标志位字段

  1. ACK:表示前面的确认号字段是否有效。ACK=1 时表示有效。只有当 ACK=1*时,前面的确认号字段才有效。TCP 规定,连接建立后,ACK 必须为 1。

  2. SYN:在建立连接时使用,用来同步序号。当 SYN=1,ACK=0 时,表示这是一个请求建立连接的报文段;当 SYN=1,ACK=1 时,表示对方同意建立连接。SYN=1 时,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中SYN 才为 1。

  3. FIN:标记数据是否发送完毕。如果 FIN=1,表示数据已经发送完成,可以释放连接。

三、TCP连接管理

  TCP连接有三个阶段:建立连接、数据传送和连接释放。每条TCP连接唯一的被通信两端的两个端点确定,TCP的连接建立采用客户机/服务器方式。

3.1 三次握手

  TCP连接的建立经历以下三个步骤,通常称为三次握手。
在这里插入图片描述
第一步:客户机的TCP首先向服务器的TCP发送一个连接请求报文段。

第二步:服务器的TCP收到连接请求报文端后,如同意建立连接,就向客户机发回确认,并为该TCP连接分配TCP缓存和变量。

第三步:当客户机收到确认报文段后,还要向服务器给出确认,并且也要给该连接分配缓存和变量。

3.2 四次挥手

TCP的连接释放过程通常称为四次挥手。
在这里插入图片描述
第一步:客户机打算关闭连接时,向其TCP发送一个连接释放报文段,并停止发送数据,主动关闭TCP连接,但另一端还可以发送数据。

第二步:服务器收到连接释放报文端后即发出确认,此时,从客户机到服务器这个方向的连接就释放了,TCP连接处于半关闭状态,但服务器若发送数据,客户机仍要接受。

第三步:若服务器已经没有要向客户机发送的数据,就通知TCP释放连接。

第四步:客户机收到连接释放报文段后,必须发出确认,经过时间等待计时器设置的时间2MSL后,客户机才进入连接关闭状态。

四、TCP可靠传输

TCP提供了可靠的传输服务,这是通过下列方式提供的:

  1. 分块发送:应用数据被分割成TCP认为最适合发送的数据块。由TCP传递给IP的信息单位称为报文段或段(segment)
  2. 定时确认重传:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
  3. 当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒
  4. 数据校验:TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。
  5. 正确排序:由于IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。
  6. 重复丢弃:IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。
  7. 流量控制:TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。
五、TCP拥塞控制

  在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏,这种情况就叫做网络拥塞。
  若出现拥塞而不进行控制,整个网络的吞吐量将随输入负荷的增大而下降。当输入的负载到达一定程度 吞吐量不会增加,即一部分网络资源会丢失掉,网络的吞吐量维持在其所能控制的最大值,转发节点的缓存不够大这造成分组的丢失是拥塞的征兆。
  TCP的四种拥塞控制算法:1.慢开始、2.拥塞控制、3.快重传、4.快恢复

六、TIME_WAIT

  在进行关闭连接四次挥手协议时,最后的ACK是由主动关闭端发出的,如果这个最终的ACK丢失,服务器将重发最终的FIN,
因此客户端必须维护状态信息允许它重发最终的ACK。如果不维持这个状态信息,那么客户端将响应RST分节,服务器将此分节解释成一个错误(在java中会抛出connection reset的SocketException)。
因而,要实现TCP全双工连接的正常终止,必须处理终止序列四个分节中任何一个分节的丢失情况,主动关闭的客户端必须维持状态信息进入TIME_WAIT状态。

6.1 大量TIME_WAIT造成的影响

  在高并发短连接的TCP服务器上,当服务器处理完请求后立刻主动正常关闭连接。这个场景下会出现大量socket处于TIME_WAIT状态。如果客户端的并发量持续很高,此时部分客户端就会显示连接不上。主动正常关闭TCP连接,都会出现TIMEWAIT。

6.2 处理TIMEWAIT过多

  打开系统的TIMEWAIT重用和快速回收

七、CLOSE_WAIT
7.1 产生原因

  在被动关闭连接情况下,在已经接收到FIN,但是还没有发送自己的FIN的时刻,连接处于CLOSE_WAIT状态。通常来讲,CLOSE_WAIT状态的持续时间应该很短,正如SYN_RCVD状态。但是在一些特殊情况下,就会出现连接长时间处于CLOSE_WAIT状态的情况。

  出现大量close_wait的现象,主要原因是某种情况下对方关闭了socket链接,但是我方忙与读或者写,没有关闭连接。代码需要判断socket,一旦读到0,断开连接,read返回负,检查一下errno,如果不是AGAIN,就断开连接。

7.2 解决方法

  基本的思想就是要检测出对方已经关闭的socket,然后关闭它。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蒙面侠1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值