TCP协议报文首部 ############### .. figure:: https://img.zhaoweiguo.com/knowledge/images/protocols/tcp_protocol2.png :width: 80% TCP协议报文头格式 TCP报文首部固定部分各字段 ========================= 1. 源端口和目的端口:: 各占两字节,分别写入源端口号和目的端口号 TCP的复用也是通过端口实现的 2. 报文段序号:: 占4字节 在一个TCP连接中传送的字节流中的每一个字节都按顺序编号 整个要传送的字节流的起始序号必须在连接建立时设置 首部中的序号字段值则是指本报文所发送的数据的第一个字节的序号 注:不是每次新连接是从1、2、3开始的,因为两次连接序号是重复的 每个连接都要有不同的序号。 这个序号的起始序号是随着时间变化的,可以看成一个 32 位的计数器,每 4 微秒加一 这个方案如果重复,需要 4 个多小时 3. 确认号:: 期望收到对方下一个报文段的第一个数据字节的序号 若确认号为N,则表明到序号N-1为止的所有数据都已正确收到 4. 数据偏移:: 指出TCP报文段的数据起始处距离TCP报文段的起始处有多远 实际上指出了TCP报文段的首部长度 5. 保留:: 保留为今后使用,目前应置为0 6. 6个控制位:: TCP 协议的控制信息,主要用来控制连接操作 7. 窗口:: 窗口字段明确指出了现在允许对方发送的数据量,该值经常在动态变化着 例如: 确认号是701,窗口字段是1000 这就表明从701算起,发送此报文段的一方还有接收1000个字节数据的接收缓存空间 8. 检验和:: 检验和字段检验的范围包括首部和数据这两部分 和UDP一样,在计算检验和时要在TCP报文段的前面加上12字节的伪首部 9. 紧急指针:: 紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数 即使窗口为零时也可发送紧急数据 10.选项:: 可选 选项有最大报文长度MSS、窗口扩大选项、时间戳选项、选择确认选项等 6个控制位 --------- 控制位顺序:: 1. URG(紧急) 2. ACK(确认) 3. PSH(推送) 4. RST(复位) 5. SYN(同步) 6. FIN(终止) 1. 紧急URG:: 当URG为1时,表明紧急指针字段有效,告诉系统有紧急数据,应尽快优先传送。 2. 确认ACK:: TCP规定,在连接建立后所有传送的报文段都必须把ACK置1 ACK(回复) 表示接收数据序号字段有效,一般用于通知发送方数据已经正确接收 代表接收确认 3. 推送PSH:: 很少使用 4. 复位RST:: 当RST=1时,表明TCP连接中出现严重错误,必须释放连接,然后再重新建立运输连接 强制断开连接,用于异常中断 5. 同步SYN:: 在连接建立时用来同步序号: SYN=1&ACK=0: 表明这是一个连接请求报文段,开始通信时连接操作中发送的第一个包中 SYN=1&ACK=1: 对方若同意建立连接,则应在响应的报文段中使用SYN=1&ACK=1 注: 如果能够过滤这样的包,则后面的操作都无法继续,可以屏蔽整个访问 6. 终止FIN:: 用来释放一个连接 当FIN=1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接 网络整体包 ========== 协议栈积累多少数据才能发送:: 1. 每个网络包能容纳的数据长度 协议栈会根据 MTU 来进行判断(最大 1500 字节) 2. 时间(毫秒为单位) 即便缓冲区中的数据长度没有达到 MSS 当经过一定时间之后, 就会把网络包发送出去 3. 应用程序指定“不等待填满缓冲区直接发送” 协议栈就会按照要求直接发送数据。 实例说明: 浏览器这种会话型的应用程序在向服务器发送数据时,等待填满缓冲区导致延迟会产生很大影响 因此一般会使用直接发送的选项。 .. figure:: https://img.zhaoweiguo.com/knowledge/images/protocols/tcp_mtu.png MTU 与 MSS .. figure:: https://img.zhaoweiguo.com/knowledge/images/protocols/tcp_mtu2.png 应用程序数据的拆分发送