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