以下内容来自个人理解,资料来源是中科院计算所老师讲课
UDP
TCP
(打破脑袋记不住怎么办!!!)
建立连接过程
连接方端口任意
被连接方端口固定
握手三步走:
SYN
ACK
SYN+ACK
连接任何一方都可以主动关闭连接
发送FIN数据包
表示己方不再发送数据
另一端可以继续发送数据
对方仍需要对接收数据进行确认
TCP是一个全双工传输协议
丢包与重传
未收到ACK表示丢包了,但是这个未收到ACK有一个时间阈值,较大或较小时的影响如下:
较大值:恢复丢包效率低
较小值:导致误重传 (Spurious Retransmission)
快速重传:
如果一个数据包之后的三个都被ACK,那么认为该包丢了,在一个RTT(Round Trip Time)内重传;
!!!拥塞控制
两种拥塞控制的策略:
- 端到端的拥塞控制(通过丢包和延迟判断拥塞情况)
好处:设计简单
坏处:性能取决于拥塞判断策略 - 网络设备的拥塞控制(通过标志位提醒拥塞 (ECN),显式的规定发送速率 (ATM))
好处:利用率高
坏处:可扩展性强
详细的拥塞控制过程:
对于网络设备,当遇到丢包需要降低发送速率,还需要定期探测最大发送速率,那么这个增减策略是什么?
一般就是线性增减(和性)或者乘性增减,两两组合共有四种策略;
快恢复:
在我们知道拥塞控制加快重传和快恢复后可以达到稳态,那么初始的时候怎么达到稳态呢?
这时候就是慢启动机制了,慢启动从3或10开始每收到ACK,若窗口大小小于门限阈值,就加 1,否则加1/cwnd,慢启动的速率:log2(target_cwnd/initial_cwnd)个RTT达到稳态
Initialization:
cwnd <- initial cwnd
if cwnd < ssthresh:
for each ack:
cwnd += 1
else:
for each ack:
cwnd += 1/cwnd
when encountering loss:
ssthresh <- cwnd
cwnd <- cwnd/2
此外快重传的时候为什么要是其后三个被确认才认为丢包?
因为传输中会有部分乱序的情况,用三个会减小误重传的几率。
对于重传机制,快重传适用于什么 ?
一般长流适用快重传,短流适用超时重传,web一般都是短流。