bigwolftime / gitmentCommentsPlugin

0 stars 0 forks source link

TCP 协议 #26

Open bigwolftime opened 3 years ago

bigwolftime commented 3 years ago

https://index1024.gitee.io/xblog/TCP/

一. TCP 报文段的首部格式

TCP 是面向字节流的, 但 TCP 传送的数据单元是报文段. 报文段分为首部和数据部分. 以下是关于 TCP 报文段的首部.

源端口 / 目的端口

分别占用 2byte.

序号

在 TCP 字节流的传输过程中, 每一个字节会按照顺序编号, 要传送的字节流的起始序号要在建立连接时设置, 此字段即表示要 发送 的数据第一个字节的序号. 占用 4byte(范围: [0, 2 ^ 32 - 1]), 达到最大值后会归零重新计数.

ex: 报文段的序号为 301, 携带 100byte 数据, 可知最后一个字节的序号为 400, 下一个报文段的序号值应为 401.

确认号

4byte, 指的是: 期望收到对方下一个报文段的第一个数据字节的序号.

以上一个为例, 计算出的下一个报文段的序号为 401, 那么就可以将确认号标记为 401, 表示: 希望下一个报文段的序号 为 401.

数据偏移

占用 4bit, 指示: 报文段的数据起始处与报文段的起始处的距离. 可以理解为 TCP 报文段的首部长度(因为 TCP 分为: 首部和数据, 即: 数据的起始地址 - 报文段的起始地址 = 首部长度).

TCP 报文段首部的前 20byte 固定长度, 但是选项和填充的数据长度可变的, 所以此处需要读取偏移量才能定位到数据.

有一点需注意: 数据偏移的单位为: 4byte(32bit), 例如: 0011(B) 表示首部长度为 4byte 3 = 12byte. 4bit 可以表示的的范围: [0, 15], 所以 TCP 报文的首部最大长度为: 4byte 15 = 60byte, 其中首部的前 20byte 长度固定, 所以选项和填充部分的最大长度为 40byte.

保留

占用 6bit, 保留今后使用.

TCP Flags

SYN: Synchronize Sequence Number. 在 TCP 握手阶段发送. SYN=1, ACK=0 表明这是一个连接请求报文段, 若对方 同意连接, 则会再响应报文中置 SYN=1, ACK=1.; ACK: 确认号的标记, 1 表示确认号字段有效, 0 表示确认号无效. TCP 规定: 连接建立后所有报文段的 ACK 需置 1; FIN: 完成数据的传输, 要求释放连接. TCP 挥手过程发送; RST: reset. 表示在 TCP 连接过程出现错误, 需释放当前连接. 还可以用此字段拒绝非法的报文或者连接; URG: 报文中含有紧急数据, 需提高优先级传送. ex: 程序在远程主机上运行, 用户发送 Ctrl + C 的中断命令, 此时若 不标记为紧急数据, 那么此指令会被存储在 TCP 缓存的末尾, 等到所有的数据被处理完毕才会交给应用程序, 这样就会浪费 许多时间. PSH: 两个程序通信时, 有时需要输入一个命令后立即收到对方的响应, 此时可以将 PSH 置为 1, 接收方将 PSH 标记为 1 的报文段尽快地交付给应用进程, 而不是等缓存满了再处理;

关于 URG / PSH: 两字段的作用都是提高报文的优先级, 但是实现的方式不同.

URG(紧急位): 数据报文直接交付给应用进程, 不会进入缓冲区;
PSH(急迫位): 此类型报文会进入到缓冲区后, TCP 立刻将缓冲区的数据交给应用进程.

窗口

滑动窗口的大小为 16bit, 可表示的最大值为: 65535. 用于接收端告知自己的缓冲区可以接受多少数据, 发送端可以根据此字段控制速率, 达到流量控制.

参考

《计算机网络》.谢希仁 一文详解 TCP

bigwolftime commented 3 years ago

ok