linux高性能服务器编程---第三章 TCP协议详解

Tcp读写都是针对缓冲区来说, 所以没有固定的读写次数对应关系.

UDP没有缓冲区, 必须及时接受数据否则会丢包, 或者接收缓冲区过小就会造成数据报截断

ISN-初始序号值 32位序号 后续的TCP报文段中序号值 seq = ISN + 报文段首字节在整个字节流中的偏移 32位确认号 收到的TCP报文序号值+1. 这个32位确认号每次发送的是上一次的应答

ACK标志: 表示确认号是否有效. 携带ACK标志的报文段称为确认报文段 PSH标志: 提示接收端应用程序从TCP接受缓冲区中读走数据, 为后续数据腾出空间 RST标志: 要求对方重新建立连接 携带......复位报文段 SYN标志: 标志请求建立一个连接 携带......同步报文段 FIN标志: 通知对方本端连接要关闭了, 携带..结束报文段

16位窗口大小: 窗口指的是接收通告窗口, 告诉对方本端的TCP 接收缓冲区还能容纳多少字节的数据 16位校验和: 可靠传输的重要保障发送端填充, 接收端执行CRC算法校验是否损坏, 同时校验TCP头部数据部分

TCP连接的建立和关闭

# 三次握手
# 客户端发送请求连接 ISN=seq + 0 = 3683340920
# mss 最大数据载量1460
IP 192.168.80.1.7467 > ubuntu.8000: 
Flags [S], seq 3683340920, win 64240, 
options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0

# 同意客户端连接
# ack = 客户端发送 seq + 1
# 同时发送服务端的seq
IP ubuntu.8000 > 192.168.80.1.7467: 
Flags [S.], seq 938535101, ack 3683340921, win 64240, 
options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0

# 虽然这个报文段没有字节 但由于是同步报文段 需要占用一个序号值
# 这里是tcpdump的处理 ack显示相对值 即 3683340921 - 3683340920 = 1
IP 192.168.80.1.7467 > ubuntu.8000: 
Flags [.], ack 938535102, win 4106, length 0


# 包含FIN标志 说明要求结束连接 也需要占用一个序号值
IP 192.168.80.1.7467 > ubuntu.8000: 
Flags [F.], seq 1, ack 1, win 4106, length 0

# 服务端确认关闭连接
IP ubuntu.8000 > 192.168.80.1.7467: 
Flags [.], ack 2, win 502, length 0

# 服务端发送关闭连接
IP ubuntu.8000 > 192.168.80.1.7467: 
Flags [F.], seq 1, ack 2, win 4105, length 0

# 客户端确认
IP 192.168.80.1.7467 > ubuntu.8000: 
Flags [.], ack 2, win 503, length 0

 

posted @ 2022-05-09 15:45  马梦佳  阅读(56)  评论(0编辑  收藏  举报