TCP-IP详解笔记8: TCP传输控制协议
TCP提供一种面向连接的、可靠的字节流服务。
TCP将用户数据打包构成报文段;它发送数据后启动一个定时器;另一端对收到的数据进行确认,对失序的数据重新排序,丢弃重复数据;TCP提供端到端的流量控制,并计算和验证一个强制性的端到端检验和
TCP首部
- TCP为应用层提供全双工服务,因此,数据能在两个方向上独立地传输。连接的每一段都必须保持每个方向上的传输数据序号。
- 首部长度: 多少个32bit的数目, 因此,4位首部长度标识了TCP首部最多(2<<4 - 1) * 4B = 60B。没有选项的话,长度是20字节。
-
- URG 紧急指针
- ACK 确认序号有效
- PSH 接收方要尽快交报文给应用层
- RST 重建连接
- 同步序号,用来发起一个连接。
- FIN 发送端完成发送任务。
TCP连接的建立和终止
curl baidu.com
<html>
<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
</html>
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
14:28:24.750037 IP own.38186 > 123.125.115.110.http: Flags [S], seq 2832499680, win 14600, options [mss 1460,sackOK,TS val 1537447629 ecr 0,nop,wscale 6], length 0
14:28:24.791235 IP 123.125.115.110.http > own.38186: Flags [S.], seq 1751808781, ack 2832499681, win 8192, options [mss 1452,sackOK,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,wscale 5], length 0
14:28:24.791286 IP own.38186 > 123.125.115.110.http: Flags [.], ack 1, win 229, length 0
14:28:24.791687 IP own.38186 > 123.125.115.110.http: Flags [P.], seq 1:163, ack 1, win 229, length 162
14:28:24.836821 IP 123.125.115.110.http > own.38186: Flags [.], ack 163, win 808, length 0
14:28:24.836866 IP 123.125.115.110.http > own.38186: Flags [P.], seq 1:306, ack 163, win 808, length 305
14:28:24.836876 IP own.38186 > 123.125.115.110.http: Flags [.], ack 306, win 245, length 0
14:28:24.836883 IP 123.125.115.110.http > own.38186: Flags [P.], seq 306:387, ack 163, win 808, length 81
14:28:24.836889 IP own.38186 > 123.125.115.110.http: Flags [.], ack 387, win 245, length 0
14:28:24.837176 IP own.38186 > 123.125.115.110.http: Flags [F.], seq 163, ack 387, win 245, length 0
14:28:24.880084 IP 123.125.115.110.http > own.38186: Flags [.], ack 164, win 808, length 0
14:28:24.880115 IP 123.125.115.110.http > own.38186: Flags [F.], seq 387, ack 164, win 808, length 0
14:28:24.880133 IP own.38186 > 123.125.115.110.http: Flags [.], ack 388, win 245, length 0
14:28:27.920615 IP 123.125.115.110.http > own.38186: Flags [R], seq 1751809169, win 0, length 0
过程如图:
终止协议, 4次握手
TCP全双工,所以,每个方向必须单独地关闭。
最大报文长度
- MMS, 建立连接时,互相告知自己的MSS. 例子中的
[mss 1460,sackOK,TS val 1537447629 ecr 0,nop,wscale 6]
, MMS为1460 - MMS选项只能在SYN报文段中出现。
- MMS值可以设置为MTU减去固定的IP首部、TCP首部长度。
- 限制另一端发送数据报的长度。使用较小的MTU。
TCP半关闭
为了数据传输完成
TCP状态迁移图
MSL
MSL 报文最大生存时间(Maximum segment lifetime)
TIME_WAIT状态也称为 2MSL等待状态。
TCP选项
时延确认, 时延必须小于500
Nagle算法, 每次只能有一个未确认的报文段。
滑动窗口协议
该协议允许发送方在停止并等待确认前可以连续发送多个分组。
发送方不必每发一个分组就停下来等待确认, 因此,可以加速数据的传输。
滑动窗口例子:
停止等待协议
滑动窗口大小为1,信道中每次只能有一个分组或是一个确认。
序号和确认号:
确认号总是声明接收方预期接收的下一个分组序号。如0号分组已经安全到达, 接收方发送一个确认号为1的ACK
发送窗口
三个变量定义了窗口的大小和位置。Sf(未完成的分组),Sn(下一个待发送分组),S(size, 大小)
差错控制
- 校验和
- 确认
- 选择性确认
- 重传。
拥塞控制
cwnd 拥塞窗口
TCP发送方使用一种反馈从另一端检测拥塞: ACK。
- 没有周期性的及时的接收到ACK,则是严重拥塞
- 接到三次重复的ACK,是轻微拥塞。
处理拥塞的方法:慢启动,拥塞避免和快速恢复。
慢启动:
指数增加:
- cwnd = 1
- 1 + 1 = 2
- 2 + 2 = 4
通过观察到新分组进入网络的速率应该与另一端返回确认的速率相同而进行工作。
慢启动,指数级增长。
拥塞避免
加性增加
- cwnd = i
- cwnd = i+1
- cwnd = i+2
快速恢复
cwnd = cwnd + (1/cwnd)
流量控制
接收方TCP控制发送方TCP, 发送方TCP控制发送方进程。反向控制。
TCP坚持定时器
意义
一个ACK丢失,发送方和接收方可能因为等待对方而使连接终止:接收方等待接受数据, 发送方等待允许它继续发送数据的窗口更新。
为了防止出现这种死锁情况, 发送方使用一个坚持定时器,周期性的向接收方查询窗口,以便发现窗口是否增大。
报文段称为窗口探查。