TCP头部格式:双方端口号,序列号,确认应答号,标志位(ACK,SYN,FIN),窗口大小
序列号:初始序列号为时间循环值,每加一次数据,就累加这次数据字节数,用于解决网络包乱序
确认应答号:下一次期望收到的序列号,在这之前的已经全部收到,不用再发了,用于解决丢包问题
TCP面向连接,何为连接:⽤于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括Socket(IP与端口)、序列号和窗⼝⼤⼩称为连接。
TPC分片:TCP 的数据⼤⼩如果⼤于 MSS ⼤⼩,则会在传输层进⾏分⽚,⽬标主机收到后,也同样在传输层组装 TCP数据包,如果中途丢失了⼀个分⽚,只需要传输丢失的这个分⽚。
UDP分片:UDP 的数据⼤⼩如果⼤于 MTU ⼤⼩,则会在 IP 层进⾏分⽚,⽬标主机收到后,在 IP 层组装完数据,接着再传给传输层,但是如果中途丢了⼀个分⽚,在实现可靠传输的 UDP 时则就需要᯿传所有的数据包,这样传输效率⾮常差,所以通常 UDP 的报⽂应该⼩于 MTU。
第三次握手可以携带数据。
查看tcp连接状态:netstat -napt
为什么要3次握手:
1.三次握⼿才可以防⽌历史连接初始化连接
2.三次握⼿才可以同步双⽅的初始序列号与应答号
为什么需要4次挥手:关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据,服务器收到客户端的 FIN 报⽂时,先回⼀个 ACK 应答报⽂,⽽服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报⽂给客户端来表示同意现在关闭连接。
TCP重传:
超时重传:超过一定时间没收到对应ACK,就重传
快速重传:收到3次同样的ACK,就重传,但不知道传一个还是多个
SACK(Selective Acknowledgment 选择性确认):基于快速重传,在TCP头中加入SACK,标记哪些数据收到了。
滑动窗口:
窗口大小由接收方来确定,接收窗口大小约等于发送窗口大小
3个指针(2个绝对指针,1个相对指针)
流量控制:
操作系统缓存区,滑动窗口:缓存区未读数据+当前滑动窗口大小==缓存区大小==最大滑动窗口大小
丢包问题:减少缓存导致窗口突然变小,无法接受客户端传过来的包,导致丢包,为了避免丢包,规定必须先减小窗口,再减少缓存。
拥塞控制:
慢启动:当发送⽅每收到⼀个 ACK,拥塞窗⼝ cwnd 的⼤⼩就会加 1
拥塞避免算法:慢启动是指数增长,到达阈值后变为线性增长
拥塞发生:
超时重传触发:重新变为1
快速重传触发:折半
标签:缓存,窗口,重传,ACK,tcp,TCP,序列号 From: https://www.cnblogs.com/sjj123/p/16663720.html