网络相关-tcp

2020-04-16 21:00:4310/1/2021, 3:34:43 AM

TCP的特点

  • 三次握手
  • 四次挥手
  • 可靠连接
  • 面向字节流
  • 提供拥塞控制
  • 丢包重传

TCP如何保证可靠传输

tcp在传输的过程中都有一个ack,接收方通过ack告诉发送方收到哪些包了。这样发送方就能知道丢包情况进而重传

TCP的三次握手

  1. client发送SYN到server发起握手
  2. server回复SYN+ACK给client
  3. client回复server一个ACK表示收到了server的SYN+ACK

握手的核心目的是告知对方SEQ,对方回复ACK(收到的SEQ+包的大小),这样发送端就知道有没有丢包了。次要目的是告知和协商一些信息

TCP的四次挥手

  1. client发送FIN包给server
  2. sever回复ACK(对应第一步FIN包的ACK)给client,表示server知道client要断开了
  3. sever发送FIN包给client,表示server也可以断开了
  4. client回复ACK给server,表示既然双方都发送FIN包表示断开,那就真的断开吧

为什么要三次握手、四次挥手

挥手的时候多一次主要是收到第一个FIN包后单独回复了一个ACK包,如果FIN+ACK和并发送那么四次挥手也变成三次了。关于为什么要分开,收到FIN后,知道对方要关闭了,然后OS通知应用层要关闭啥的,这里应用层可能需要做些准备工作,有一些延时,所以先回ACK,准备好了再发FIN。握手没有这个准备过程(服务端在LISTEN状态下)所以可以立即发送SYN+ACK

ACK

ACK = SEQ + LEN(包的大小),这样发送方可以明确知道对方收到哪些东西

拥塞控制

拥塞控制主要作用于网络,防止过多的数据拥塞网络,避免出现网络负载过大的情况。拥塞处理包括以下算法:慢开始、拥塞避免、快速重传

慢开始

在传输开始时将发送窗口慢慢指数级扩大,从而避免一开始就传输大量数据导致网络拥塞

慢开始算法步骤具体如下:

  1. 连接初始设置拥塞窗口(Congestion Window)为1MSS(一个分段的最大数据量)
  2. 每过一个RTT(表示发送端发送数据到接收到对端数据所需的往返时间)就将窗口大小x2
  3. 指数级增长肯定不能没有限制,所以有一个阈值限制,当窗口大小大于阈值时就会启动拥塞避免算法

拥塞避免算法

拥塞避免算法相比简单点,每过一个RTT,拥塞窗口大小+1,这样能避免指数级增长导致网络拥塞,慢慢将大小调整到最佳值。在传输过程中可能会遇到定时器超时的情况,这时TCP就会认为网络拥塞了,会马上进行以下步骤:

  1. 将阈值设为当前拥塞窗口的一半
  2. 将拥塞窗口设为1MSS
  3. 启动拥塞避免算法

快速重传

一旦接收端收到的报文出现失序的情况,接收端指会回复最后一个顺序正确的报文序号(没有SACK的情况)。如果收到三个重复的ACK,无需等待定时器超时再重发而是启动快速重传。