计算机网络:TCP/UDP相关概念详解
由于TCP相关的概念在网络上众说纷纭,没有一个统一的版本,面试的时候也只是走走过场,在这篇文章,会参考Top-Down这本书的介绍对TCP相关的面试作答,笔试作答作一个规范。

先来看看UDP,这是一个比较简单的协议
UDP:
他的特点是?
1.不可靠,没有顺序的传递packet。
2. connectionless,没有三次握手(3-way shake hands)
3. 很小的header size
4.没有拥塞控制,在拥挤的情况下也能发挥作用
他用在什么地方?
- 流媒体应用 streaming multimedia apps (loss tolerant, rate sensitive)
- DNS
- SNMP
- HTTP 3.0
有一个需要注意的点:udp有一个保证可靠性的header,checksum,校验数据是否出问题。
TCP:
可靠性:
0. 首先它有checksum保证传输数据不出错
- Stop and Wait Operation: 有序列号seq,ACK,保证数据的完整性Integrity,用piplining提高利用率utilization
2.利用piplining的时候,有Go-Back-N和Selective-Repeat机制(mechanism),超时重传(over timeout retransmission),快重传(fast retransmission)
3. MSS(maximum segment size) ,约定好最大segment size,重传也能续上
4.在复杂的网络,需要流量控制(flow control)和拥塞控制(congestion control)
如何定义timeout?
一般来说,TimeoutInterval = EstimatedRTT + 4*DevRTT
而 EstimatedRTT可以由sampleRTT计算而来,
4*DevRTT被叫做safety margin
DevRTT = (1-b)*DevRTT + b*|SampleRTT-EstimatedRTT|
什么是seq和ACK?
seq指的是,发出信息的序列号
ACK指的是,期望收到信息的序列号,因此收到三个一样的ACK,快重传这个ACK的seq
流量控制:
TCP receiver 会发送tcp报文,在报文里有一个 rwnd 区域会告知 free buffer space
拥塞控制:
- AIMD(Additive Increase Multiplicative Decrease),拥塞也是使用一个窗口来控制,这个窗口的大小随着ACK的增加一点一点增加,但是随着loss成倍的减小
- slow start (慢开始),建立连接的时候,cwnd初始设置为1,每次RTT变成两倍,直到first loss event发生
- fast recovery(快恢复),如果执行到三个同样ACK时,使用AIMD减小窗口,而不是重新slow start
建立连接:
为了建立稳定的连接,并且避免历史ACK对连接的影响
1.sender send SYNbit=1,Seq=x
2. receiver send SYNbit=1 Seq=y,ACK=x+1
3.sender send ACK=y+1
4.receiver got and start the connection