网络相关-tcp
2020-04-16 21:00:4310/1/2021, 3:34:43 AM
TCP的特点
- 三次握手
- 四次挥手
- 可靠连接
- 面向字节流
- 提供拥塞控制
- 丢包重传
TCP如何保证可靠传输
tcp在传输的过程中都有一个ack,接收方通过ack告诉发送方收到哪些包了。这样发送方就能知道丢包情况进而重传
TCP的三次握手
- client发送SYN到server发起握手
- server回复SYN+ACK给client
- client回复server一个ACK表示收到了server的SYN+ACK
握手的核心目的是告知对方SEQ,对方回复ACK(收到的SEQ+包的大小),这样发送端就知道有没有丢包了。次要目的是告知和协商一些信息
TCP的四次挥手
- client发送FIN包给server
- sever回复ACK(对应第一步FIN包的ACK)给client,表示server知道client要断开了
- sever发送FIN包给client,表示server也可以断开了
- client回复ACK给server,表示既然双方都发送FIN包表示断开,那就真的断开吧
为什么要三次握手、四次挥手
挥手的时候多一次主要是收到第一个FIN包后单独回复了一个ACK包,如果FIN+ACK和并发送那么四次挥手也变成三次了。关于为什么要分开,收到FIN后,知道对方要关闭了,然后OS通知应用层要关闭啥的,这里应用层可能需要做些准备工作,有一些延时,所以先回ACK,准备好了再发FIN。握手没有这个准备过程(服务端在LISTEN状态下)所以可以立即发送SYN+ACK
ACK
ACK = SEQ + LEN(包的大小)
,这样发送方可以明确知道对方收到哪些东西
拥塞控制
拥塞控制主要作用于网络,防止过多的数据拥塞网络,避免出现网络负载过大的情况。拥塞处理包括以下算法:慢开始、拥塞避免、快速重传
慢开始
在传输开始时将发送窗口慢慢指数级扩大,从而避免一开始就传输大量数据导致网络拥塞
慢开始算法步骤具体如下:
- 连接初始设置拥塞窗口(Congestion Window)为1MSS(一个分段的最大数据量)
- 每过一个RTT(表示发送端发送数据到接收到对端数据所需的往返时间)就将窗口大小x2
- 指数级增长肯定不能没有限制,所以有一个阈值限制,当窗口大小大于阈值时就会启动拥塞避免算法
拥塞避免算法
拥塞避免算法相比简单点,每过一个RTT,拥塞窗口大小+1,这样能避免指数级增长导致网络拥塞,慢慢将大小调整到最佳值。在传输过程中可能会遇到定时器超时的情况,这时TCP就会认为网络拥塞了,会马上进行以下步骤:
- 将阈值设为当前拥塞窗口的一半
- 将拥塞窗口设为1MSS
- 启动拥塞避免算法
快速重传
一旦接收端收到的报文出现失序的情况,接收端指会回复最后一个顺序正确的报文序号(没有SACK的情况)。如果收到三个重复的ACK,无需等待定时器超时再重发而是启动快速重传。