TCP
一,报文结构
- TCP的包是没有IP地址的,那是IP层上的。但是有源端口和目标端口。
- Window又叫Advertised-Window,也就是滑动窗口(Sliding Window)
TCP Flag ,也就是包的类型,主要是用于操控TCP的状态机的。
SYN 同步序号 FIN 发送方完成数据发送 RST 复位连接 PSH 尽可能的将数据送往接收进程
二,建立与关闭连接
关于建连接时SYN超时
在Linux下,默认重试次数为5次,重试的间隔时间从1s开始每次都翻售,5次的重试时间间隔为1s, 2s, 4s, 8s, 16s,总共31s,第5次发出后还要等32s都知道第5次也超时了,所以,总共需要 1s + 2s + 4s+ 8s+ 16s + 32s = 2^6 -1 = 63s,TCP才会把断开这个连接。TIME_WAIT
TIME_WAIT状态也称2MSL(报文段最大生存时间)等待状态。
从TIME_WAIT状态到CLOSED状态,有一个超时设置,这个超时设置是 2*MSL(RFC793定义了MSL为2分钟,Linux设置成了30s)
三,可靠数据传输
1,MSS
最大报文段长度表示TCP传往另一端的最大数据库的长度。当一个连接建立的时候,连接的双发都要告知各自的MSS。
报文段越大允许每个报文段传送的数据就越多,相对IP和TCP首部就有更高的利用率。
2,序号
用来解决网络包乱序(reordering)问题
3,确认号
用来解决不丢包的问题
4,滑动窗口
TCP头里有一个字段叫Window,又叫Advertised-Window,这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。
5,超时重传
根据RTT(Round Trip Time)设置RTO(Retransmission TimeOut)。
6,快速重传
如果发送方连续收到3次相同的ack,就立即重传。
7,Nagle算法
延迟小分组的发送
四,拥塞控制
1,慢启动
- 连接建好的开始先初始化cwnd = 1,表明可以传一个MSS大小的数据。
- 每当收到一个ACK,cwnd++; 呈线性上升
- 每当过了一个RTT,cwnd = cwnd*2; 呈指数让升
- 还有一个ssthresh(slow start threshold),是一个上限,当cwnd >= ssthresh时,就会进入“拥塞避免算法”
2,拥塞避免
一般来说ssthresh的值是65535,单位是字节,当cwnd达到这个值时后
- 收到一个ACK时,cwnd = cwnd + 1/cwnd
- 当每过一个RTT时,cwnd = cwnd + 1
3,快速恢复
3个重复的Ack会进入快速恢复算法,进入Fast Recovery之前,cwnd 和 sshthresh已被更新:
- cwnd = cwnd /2
- sshthresh = cwnd
算法描述:
- cwnd = sshthresh + 3 * MSS (3的意思是确认有3个数据包被收到了)
- 重传Duplicated ACKs指定的数据包
- 如果再收到 duplicated Acks,那么cwnd = cwnd +1
- 如果收到了新的Ack,那么,cwnd = sshthresh ,然后就进入了拥塞避免的算法了。
UDP
1,报文结构
2,优势
- 实时发送,由应用程序精确控制发送时间
- 无需连接建立,发送效率高
- 无连接状态,连接开销下,可创建更多连接
- 分组首部开销小,tcp首部20字节,udp只需8字节
参考资料
- TCP 的那些事儿(上)
- TCP 的那些事儿(下)
- 《TCP/IP 详解 卷1:协议》
- 《计算机网络-自顶向下方法》—陈鸣译