1. TCP报文段结构
TCP即传输控制协议(Transmission Control Protocol ),它是Internet传输层协议,提供面向连接、 可靠、 有序、 字节流 传输服务。
主要有以下特点:
1. 应用进程先建立连接;
2. 每一条TCP连接只有两个端点;
3. 可靠交付: 无差错, 不丢失, 不重复, 按序到达;
4. 全双工通信;
5. 面向字节流;(流: 字节序列。 应用程序和TCP的交互是一个个数据块, TCP把他们看做是无结构字节流)。
TCP协议传输示意图:
TCP协议报文段结构:
TCP段的首部长度最短是20字节,由于选项长度可变,所以最长为60字节,TCP首部各个字段如下:
1. 源端口号字段, 目的端口号字段: 各占16位。用于复用和分解上层应用的数据。
2. 序号字段、确认序号字段:各占32位。
(1). 序号字段:TCP的序号是对每个应用层数据的每个字节进行编号,用 ack_seq 表示;
(2). 确认序号字段:期望从对方接收数据的字节序号,即该序号对应的字节尚未收到。
3. 首部长度字段:占4位。指出TCP段的首部长度,以4字节为计算单位。
4. 保留字段:占6位。保留为今后使用,目前值为0。
5. URG、ACK、PSH、RST、SYN、FIN各占1位。为标志位字段; 各占1位,取值为0或1。
(1). URG:紧急URG=1,紧急指针字段有效,优先传送;
(2). ACK:确认ACK=1,确认序号字段有效;ACK=0时,确认序号字段无效;
(3). PSH:推送PSH=1,尽快将报文段中的数据交付接收应用进程,不要等缓存满了再交付;
(4). RST:复位RST=1,TCP连接出现严重差错,释放连接,再重新建立TCP连接;
(5). SYN:同步SYN=1,该TCP报文段是一个建立新连接请求控制段或者同意建立新连接的确认段;
(6). FIN:终止FIN=1,TCP报文段的发送端数据已经发送完毕,请求释放连接。
6. 接收窗口字段:占16位。向对方通告我方接收窗口的大小,实现TCP的流量控制。
7. 校验和字段:占16位。 计算方法与UDP校验和的计算方法相同。
8. 紧急指针字段:占16位。URG=1时,才有效,用于指出在本TCP报文段中紧急数据共有多少个字节。
9. 选项字段:长度可变,最短为0字节,最长为40字节。
10. 填充字段,取值全为0。目的是为了整个首部长度是4字节的整倍数。
2. TCP连接管理
TCP连接管理:连接建立与连接拆除。
1. 三次握手:TCP连接建立。
三次握手中的数据交互:
1. 第一次握手:客户向服务器发送连接请求段:(SYN=1,seq=x)。
SYN=1:建立连接请求控制段 。
seq=x:表示传输的报文段的第1个数据字节的序列号是x,此序列号代表整个报文段的序号,(sequence number,序号的意思)。
客户端进入SYN_SEND(同步发送)。
2. 第二次握手: 服务器发回确认报文段:(SYN=1,ACK=1,seq=y, ack_seq=x 1)。
SYN=1:同意建立新连接的确认段。
ACK=1:确认序号字段有效 。
seq=y:服务器告诉客户确认报文段的序列号是y。
ack_seq=x 1:表示已经收到了序列号为x的报文段,准备接收序列号为x 1的报文段。
服务器由LISTEN进入SYN_RCVD(同步收到)。
3. 第三次握手: 客户对服务器的 同意连接报文段 进行确认:(ACK=1,seq=x 1,ack_seq=y 1)。
ACK=1:确认序号字段有效 。
seq=x 1:客户此次的报文段的序列号是x 1。
ack_seq=y 1:客户期望接收服务器序列号为y 1的报文段。
当客户发送ACK时,客户端进入ESTABLISHED状态; 当服务收到ACK后,也进入ESTABLISHED状态; 第三次握手可携带数据。
常见面试题:TCP连接建立为什么需要三次握手?
第一次握手:客户发送请求,此时服务器知道客户能发。
第二次握手:服务器发送确认,此时客户知道服务器能发能收。
第三次握手:客户发送确认,此时服务器知道客户能收。
2. 四次挥手:TCP连接拆除。
四次挥手中的数据交互:
1. 第一次挥手:客户向服务器发送释放连接报文段:(FIN=1,seq=u)。
FIN=1:发送端数据发送完毕,请求释放连接。
seq=u:传输的第一个数据字节的序号是u 。
客户端状态由ESTABLISHED进入FIN_WAIT_1(终止等待1状态)。
2. 第二次挥手:服务器向客户发送确认段:(ACK=1,seq=v,ack_seq=u 1)。
ACK=1:确认字号段有效。
ack_seq=u 1:服务器期望接收客户数据序号为u 1。
seq=v:服务器传输的数据序号是v。
服务器状态由ESTABLISHED进入CLOSE_WAIT(关闭等待),客户端收到ACK段后,由FIN_WAIT_1进入FIN_WAIT_2。
3. 第三次挥手:服务器向客户发送释放连接报文段:(FIN=1,ACK=1,seq=v 1,ack_seq=u 1)。
FIN=1:请求释放连接 ACK=1:确认字号段有效。
ack_seq=u 1:表示服务器期望接收客户数据序号为 u 1。
seq=v 1:表示自己传输的第一个数据字节的序号是 v 1。
服务器状态由CLOSE_WAIT进入LAST_ACK(最后确认状态)。
4. 第四次挥手:客户向服务器发送确认段:(ACK=1,seq=u 1,ack_seq= v 1 1 )。
ACK=1:确认字号段有效。
ack_seq=v 1 1:表示客户期望接收服务器数据序号为v 1 1。
seq=u 1:表示客户传输的数据的序号是u 1。
客户端状态由FIN_WAIT_2 进入TIME_WAIT,等待2MSL时间,进入CLOSED状态中;服务器在收到最后一次ACK后,由LAST_ACK进入CLOSED。
3. TCP可靠数据传输
可靠数据传输:保证接收方应用进程从缓冲区读出的字节流与发送方发出的字节流是完全一样的。
TCP实现可靠数据传输服务的工作机制:
1. 应用层数据被分割成TCP认为最适合发送的数据块。
2. 序号,发送方对发送的数据包进行编号,确保数据按序提交给接收方。
3. 确认,接收方向发送方反馈接收状态,确认是否正确接收数据,TCP采用累积确认。
TCP生成ACK的策略:
(1). 所期望序号的报文段按序到达,所有在期望序号及以前的报文段都已被确认,则TCP延迟 500ms发送ACK。
(2). 所期望序号的报文段按序到达、且另一个按序报文段在等待ACK传输,TCP接收方立即发送单个累计ACK,确认以上两个按序到达报文段。
(3). 拥有序号大于期望序号的失序报文段到达,TCP接收方立即发送重复ACK,指示下一个期望接收字节的序号。
(4). 收到一个报文段,部分或完全填充接收数据间隔。
4. 查错检测,利用差错编码实现数据包传输过程中的比特查错检测(甚至纠正)。
5. 重传,发送发重新发送接收方没有正确接收的数据。
6. 计时器,在发送发引入计时器,解决数据丢失问题。
计时器超时时间设置:
TimeoutInerval = EstimatedRTT 4 × DevRTT
EstimatedRTT:抽样RTT的加权移动平均值。
DevRTT:偏差RTT
4. TCP流量控制
流量控制:协调发送方与接收方的数据发送与接收速度。
在通信过程中,接收方设置报文段的接收窗口字段来将窗口大小通知给发送方。
5. TCP拥塞控制
网络拥塞:太多的主机以太快的速度向网络中发送太多的数据,超出了网络处理能力,导致大量数据分组拥挤在中间设备队列中等待转发,网络性能显著下降的现象。
拥塞控制:通过合理调度、规范、调整向网络中发送数据的主机数量、发 送速率、数据量,以避免拥塞或消除已发生的拥塞。
拥塞窗口(CongWin):连接开始,为1MSS 。1个最大报文段长度(Maximum Segment Size , MSS)。
阈值(Threshold):临界值。
TCP拥塞控制算法如下:
1. 慢启动
慢启动算法:在TCP连接建立时,每经 过1个RTT时间,拥塞窗口增大一倍。
MSS与RTT的变化关系如下图所示:
2. 拥塞避免
拥塞避免算法:当拥塞窗口大于等于阈 值时,每经过1个RTT,拥塞窗口的值 加1。
3. 快速重传
发生计时器超时,需要进行重传。
新的阈值:为当前拥塞窗口的一半。
新的拥塞窗口:直接调整为1MSS。
调整好新的阈值和新的拥塞窗口后,使用慢启动,拥塞避免算法增加拥塞窗口 大小。
4. 快速恢复
当发生3次重复确认时,网络拥塞程度不是很严重,需要进行快速恢复。
新的阈值:为当前拥塞窗口的一半。
新的拥塞窗口:调整为新的阈值。
调整好新的阈值和新的拥塞窗口后,直接从新的阈值开 始,使用拥塞避免算法增加拥塞窗口大小。
窗口调整的基本策略 (Additive Increase,Multiplicative Decrease ,AIMD): 网络未发生拥塞时,逐渐 "加性" 增大窗口,网络拥塞时 "乘性" 减小窗口。
拥塞预防策略: 流量整形技术,即规范主机向网络发送数据的流量。