Linux网络编程: TCP协议首部与可选项简述

一、TCP/IP五层模型

在这里插入图片描述

  1. 物理层(Physical Layer):物理层是最底层,负责传输比特流(bitstream)以及物理介质的传输方式。它定义了如何在物理媒介上传输原始的比特流,例如通过电缆、光纤或无线传输等。

  2. 数据链路层(Data Link Layer):数据链路层位于物理层之上,负责在直接相连的节点之间传输数据帧(Frame)。它将比特流组织成帧,并提供数据的可靠传输、差错检测和纠正等功能。常见的协议包括以太网(Ethernet)和Wi-Fi。

  3. 网络层(Network Layer):网络层处理分组(Packet)的传输和路由,负责将数据从源主机传输到目标主机。它定义了逻辑地址(如IP地址)和路由选择算法,并通过Internet Protocol (IP) 进行数据的分组、定址和转发。

  4. 传输层(Transport Layer):传输层提供端到端的可靠数据传输服务,负责将数据从发送方传输到接收方的端口。它通过传输协议(如TCP和UDP)提供了连接管理、流量控制、差错检测和纠正等功能。

  5. 应用层(Application Layer):应用层是最高层,负责处理特定应用程序之间的通信。它包括各种应用协议,如HTTP、FTP、SMTP和DNS等,用于实现不同应用程序之间的数据交换和通信。

二、TCP协议特点

TCP 是⾯向连接的、可靠的、基于字节流的传输层通信协议

  1. ⾯向连接:TCP是一种面向连接的协议,通信双方在传输数据之前需要先建立连接,才可以发送消息。不能像UDP协议可以⼀个主机同时向多个主机发送多播消息。

  2. 可靠性:TCP通过序号、确认和重传机制实现了数据的可靠传输,确保数据无差错、不丢失、不重复地准确到达接收方。

  3. 字节流:TCP消息是没有边界的,将数据视为一连续的字节流进行传输,所以⽆论我们消息有多⼤都可以进⾏传输。并且消息是有序的,当前⼀个消息没有收到的时候,即使它先收到了后⾯的字节,那么也不能扔给应⽤层去处理,同时对重复的报⽂会⾃动丢弃。发送方将数据划分为小的数据块,而接收方会根据需要重组这些数据块。

  4. 全双工: TCP支持全双工通信,允许双方在连接建立后同时发送和接收数据。

二、TCP协议首部

RFC

https://www.rfc-editor.org/rfc/rfc793.txt
https://www.rfc-editor.org/rfc/rfc1011.txt Urgent Pointer
https://www.rfc-editor.org/rfc/rfc1122.txt Urgent Pointer
https://www.rfc-editor.org/rfc/rfc6093.txt Urgent Pointer
https://www.rfc-editor.org/rfc/rfc2018 Selective Acknowledgment
https://datatracker.ietf.org/doc/html/rfc6691 MSS
https://www.rfc-editor.org/rfc/rfc7413.txt Fast Open

TCP协议首部

在这里插入图片描述

  • 源端口(Source Port) ,16位,指明发送数据的进程使用的端口号。
  • 目的端口(Destination Port),16位,指明数据将发往目的主机的端口号。
  • 序号(Sequence Number),32位,表示该报文段所发送数据的第一个字节的编号,在TCP连接中所传输字节流的每一个字节都会按顺序编号,由于序列号是由32位表示,所以每2^32个字节,就会产生序列号回绕,再次从0开始。在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该值。
  • 确认号(Acknowledgment Number),32位,表示接收方期望收到发送方下一个报文段的第一个字节数据的编号,也就是告诉发送方:我希望你下次发送的数据的第一个字节数据的编号为此确认号。确认号只有在ACK标志为1时才有效。发送端收到确认应答后代表确认序号之前的数据都已经被正常接收。 序号和确认号可以参考文章Linux网络编程: TCP协议之序号和确认号详解
  • 数据偏移(Data Offset),4位,他指出TCP报文段的数据起始距离TCP报文段的起始处有多远。实际上是TCP首部长度,用来标识数据段的起始位置。最大能表示的数是15,单位是4个字节,因此数据偏移的最大值是60个字节,这也是TCP首部的最大字节。因为固定首部的存在,数据偏移的值最小为20个字节,因此选项长度不能超过40字节*(减去20个字节的固定首部)。
  • 保留位(Reserved),6位,保留为今后使用,现在必须置为0。

紧接着是6位标志位。

  • URG 紧急,1位。当URG=1时,表明紧急指针字段有效。
    它告诉系统此报文段中有紧急数据,应尽快发送(相当于高优先级的数据),而不要按原来的排队顺序来传送。当URG置为1时,应用进程就告诉TCP有紧急数据要传送。于是TCP就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍然是普通数据。这时要与首部中紧急指针(Urgent Pointer)字段配合使用。
  • ACK 确认,1位。确认序号有效,只有ACK=1的时候,前面的确认号字段才有效,TCP规定,建立连接后,ACK必须为1,带ACK标志的TCP报文段称为确认报文段。
  • PSH 推送,1位。表示接收方应该尽快将这个报文交给应用层,为后续数据腾出空间。如果为1,表示对方应当立即吧数据交给上层应用,而不是缓存起来,如果应用程序不将收到的数据读走,就会一直停留在TCP接收缓冲区中。当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应。在这种情况下,TCP就可以使用推送(push)操作。发送方TCP把PSH置为1,并立即创建一个报文段发送出去。接收方TCP收到PSH=1的报文段,就尽快地(即“推送”向前)交付接收应用进程。而不用再等到整个缓存都填满了后再向上交付。
  • RST 复位,1位。当RST=1时,表明TCP连接中出现了严重错误(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立传输连接。RST置为1还用来拒绝一个非法的报文段或拒绝打开一个连接。
  • SYN 同步,1位。在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN=1和ACK=1。因此SYN=1就表示这是一个连接请求或连接接受报文。
  • FIN 终止, 1位。断开一个连接,表示通知告知对方本段要关闭连接了,标记数据是否发送完毕,当FIN=1,表示告诉对方“我的数据已经发送完毕,你可以释放连接了”,FIN标志的TCP报文段称为结束报文段。

SYN和ACK标志用于TCP三次握手以建立连接。FIN和ACK用于TCP四次挥手断开连接。

  • 窗口大小(Window),16位。表示现在允许对方发送的数据量,也就是告诉对方,本报文段确认号开始允许对方发送的数据量,到达此值,需要ACK确认后才能继续发送数据。
    窗口指的是发送本报文段的一方的接受窗口(而不是自己的发送窗口),窗口大小是给对方用的。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。
  • 校验和(Checksum),16位。检验和字段检验的范围包括首部和数据这两部分。通过CRC算法提供额外的可靠性。
  • 紧急指针(Urgent Pointer),16位。紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据)。因此,在紧急指针指出了紧急数据的末尾在报文段中的位置。当所有紧急数据都处理完时,TCP就告诉应用程序恢复到正常操作。值得注意的是,即使窗口为0时也可以发送紧急数据。但是在实际操作中很少使用紧急指针。
  • 选项部分(Options)
    长度可变,最长可达40个字节。当没有使用“选项”时,TCP的首部长度是20字节。最大长度可以根据TCP首部长度进行推算。

首部可选项

TCP头部的最后一个选项字段(options)是可变长的可选信息。这部分最多包含40字节,因为TCP头部最长是60字节(其中还包含前面讨论的20字节的固定部分)。典型的TCP头部选项结构如图所示。
在这里插入图片描述

有的TCP选项没有后面两个字段,仅包含1字节的kind字段

  • 第一个字段kind,说明选项的类型。
  • 第二个字段length,(如果有的话)指定该选项的总长度。该长度包括kind字段和length字段占据的2字节。
  • 第三个字段info,(如果有的话)是选项的具体信息

可用可选项

常见的选项有如下几种。

  1. kind=0,选项表结束(EOP)选项
    一个报文段仅用一次。放在末尾用于填充,用途是说明:首部已经没有更多的消息,应用数据在下一个32位字开始处

  2. kind=1,空操作(NOP)选项
    没有特殊含义,一般用于将TCP选项的总长度填充为4字节的整数倍

  3. kind=2,最大报文段长度(MSS)选项
    TCP连接初始化时,通信双方使用该选项来协商最大报文段长度。TCP模块通常将MSS设置为(MTU-40)字节(减掉的这40字节包括20字节的TCP头部和20字节的IP头部)。这样携带TCP报文段的IP数据报的长度就不会超过MTU(假设TCP头部和IP头部都不包含选项字段,并且这也是一般情况),从而避免本机发生IP分片。对以太网而言,MSS值是1460(1500-40)字节。

  4. kind=3,窗口扩大因子选项
    TCP连接初始化时,通信双方使用该选项来协商接收窗口的扩大因子。在TCP的头部中,接收窗口大小是用16位表示的,故最大为65535字节,但实际上TCP模块允许的接收窗口大小远不止这个数(为了提高TCP通信的吞吐量)。窗口扩大因子解决了这个问题。
    假设TCP头部中的接收通告窗口大小是N,窗口扩大因子(移位数)是M,那么TCP报文段的实际接收通告窗口大小是N*2M,或者说N左移M位。注意,M的取值范围是0~14。我们可以通过修改 /proc/sys/net/ipv4/tcp_window_scaling 内核变量来启用或关闭窗口扩大因子选项。
    和MSS选项一样,窗口扩大因子选项只能出现在同步报文段中,否则将被忽略。但同步报文段本身不执行窗口扩大操作,即同步报文段头部的接收窗口大小就是该TCP报文段的实际接收窗口大小。当连接建立好之后,每个数据传输方向的窗口扩大因子就固定不变了。

  5. kind=4,选择性确认(Selective Acknowledgment,SACK)选项
    TCP通信时,如果某个TCP报文段丢失,则TCP会重传最后被确认的TCP报文段后续的所有报文段,这样原先已经正确传输的TCP报文段也可能重复发送,从而降低了TCP性能。SACK技术正是为改善这种情况而产生的,它使TCP只重新发送丢失的TCP报文段,而不用发送所有未被确认的TCP报文段。选择性确认选项用在连接初始化时,表示是否支持SACK技术。我们可以通过修改 /proc/sys/net/ipv4/tcp_sack 内核变量来启用或关闭选择性确认选项。

  6. kind=5,SACK实际工作的选项
    该选项的参数告诉发送方本端已经收到并缓存的不连续的数据块,从而让发送端可以据此检查并重发丢失的数据块。每个块边沿(edge of block)参数包含一个4字节的序号。其中块左边沿表示不连续块的第一个数据的序号,而块右边沿则表示不连续块的最后一个数据的序号的下一个序号。这样一对参数(块左边沿和块右边沿)之间的数据是没有收到的。因为一个块信息占用8字节,所以TCP头部选项中实际上最多可以包含4个这样的不连续数据块(考虑选项类型和长度占用的2字节)。

  7. kind=8,时间戳选项。
    该选项提供了较为准确的计算通信双方之间的回路时间(Round Trip Time,RTT)的方法,从而为TCP流量控制提供重要信息。我们可以通过修改 /proc/sys/net/ipv4/tcp_timestamps 内核变量来启用或关闭时间戳选项。

  8. kind=34, 快速打开
    TCP Fast Open 是 Google 在 ACM CoNEXT 会议上发表的改善 Web 应用响应延时方面的一个研究成果,简单实现原理是通过修改 TCP 协议利用三次握手时进行数据交换。属于底层协议级别的优化方案,在 RTT (Round Trip Time,详见注释) 比较低时,客户端页面加载时间优化依然可以提升大约4%~5%,RTT 越长,优化效果越好,实际互联网环境下测试结果平均性能提升大约在 25%。同时因为每个请求都节省了一次RTT,在大并发情况下还可以节省处理器资源,其给出的测试数据为每秒处理事务数由 2876.4 上升到 3548.7。需要Linux内核 3.7.1 以及更高版本。

可选项抓包

抓取一个TCP连接的SYN包。
在这里插入图片描述
对齐很重要啊!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/474351.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯 第3217题 简单的异或难题 C++ Java Python

题目 思路和解题方法 计算给定数组中子数组异或和的问题。它采用了前缀异或的方法来预处理数组,然后对于每个查询,通过异或操作计算子数组的异或和。 读取输入的数组,并计算每个位置的前缀异或和。对于每个查询,读取查询的左右边界…

有哪些好用的客户管理软件?这5款系统好在哪里?

问题链接:有哪些客户管理比较好的软件? - 知乎 从题主的描述来看,问题主要聚集在客户信息管理、销售流程管理、客户优先级管理这几大方面,再回答这个问题之前,我们要先明确几个问题。比如,客户对企业的重要…

蓝桥杯--错误票据

求解答,不知道出现什么问题(虽然知道自己写的挺麻烦的,但是孩子能写出来就不容易了) public class top2 {//错误票据public static void main(String[] args){Scanner scannernew Scanner(System.in);int wscanner.nextInt();String []snew S…

uniapp 开发微信小程序 出现启用组件按需注入问题如何解决

问题描述 在使用uniapp 开发微信小程序,进行上架发布时 代码质量栏 出现启用组件按需注入问题。 虽然现实代码上传成功,但是作为一个吹毛求疵的老猿人,肯定是无法容忍的。那么如何解决呢? 问题解决方案 在uniapp端&#xff0c…

GDB界面调试CGDB快速上手

什么是 CGDB? CGDB 是一个基于 GNU Debugger(GDB)的 Curses(字符用户界面)前端。它提供了一个类似于文本编辑器的界面,可以帮助用户更轻松地执行调试操作,而无需离开终端。 安装 CGDB 首先&a…

【鸿蒙HarmonyOS开发笔记】通知模块之发布进度条类型通知

概述 进度条通知也是常见的通知类型,主要应用于文件下载、事务处理进度显示。HarmonyOS提供了进度条模板,发布通知应用设置好进度条模板的属性值,如模板名、模板数据,通过通知子系统发送到通知栏显示。 目前系统模板仅支持进度条…

HarmonyOS定时器与定时任务

HarmonyOS 的 ArkTS 说白了 就是 TS和JS混合 加了一些新特性的语言 定时任务 就还是用 js代码就OK了 我们代码这样写 Entry Component struct Twox {build() {Row() {Column(){Button("触发定时任务").onClick(()>{setTimeout(()> {console.log(执行)},2000…

【毕设级项目】基于ESP8266的家庭灯光与火情智能监测系统——文末源码及PPT

目录 系统介绍 硬件配置 硬件连接图 系统分析与总体设计 系统硬件设计 ESP8266 WIFI开发板 人体红外传感器模块 光敏电阻传感器模块 火焰传感器模块 可燃气体传感器模块 温湿度传感器模块 OLED显示屏模块 系统软件设计 温湿度检测模块 报警模块 OLED显示模块 …

LoRa模块在野外科研与环境保护中的角色:科技守护自然之宝

随着科技的不断发展,LoRa(低功耗广域网)模块在野外科研与环境保护中正发挥着越来越重要的作用。其卓越的通信能力、低功耗特性以及良好的穿透能力,为科学家和环保人士提供了一种先进的技术手段,有助于更深入、更全面地…

MAC IntelliJ IDEA搭建Doris Fe

目录 版本信息 安装环境依赖 拉取源码 下载 Doris 编译依赖 修改系统最大文件句柄数 编译 Doris 配置 Debug 环境 生成 FE 代码 FE模块代码导入 配置 Debug FE 启动 FE 报错问题 版本信息 本次安装的doris版本信息为doris-2.1.0-rc11 IntelliJ IDEA 配置jdk17、m…

优雅的 Markdown

Markdown浅尝 一、勾选框 注意[]前后都要有空格 - [x] 干的漂亮 - [x] 吃饭 - [x] 写代码 - [ ] 睡觉 干的漂亮 吃饭 写代码 睡觉 二、列表 #无序列列表 * 换成 - 也行 * 你 * 你好 * 你好呀 - 你很好啊 你你好你好呀你很好啊 #有序列表 . 后面有个空格 1. 我 2. 是我 3.…

Spring MVC开发小练习

1. 加法计算器 需求:输入两个整数,计算和 约定前后端交互接口: 在开发项目前,根据需求先约定好前后端交互接口,双方按照接口文档进行开发,接口文档一旦写好,尽量不要轻易改变,如果…

python大学生健身爱好者交流网站flask-django-nodejs-php

任何系统都要遵循系统设计的基本流程,本系统也不例外,同样需要经过市场调研,需求分析,概要设计,详细设计,编码,测试这些步骤,基于python技术、django/flask框架、B/S机构、Mysql数据…

全面:vue.config.js 的完整配置

vue.config.js是Vue项目的配置文件,用于配置项目的构建、打包和开发环境等。 在Vue CLI 3.0之后,项目的配置文件从原来的build和config目录下的多个配置文件,合并成了一个vue.config.js文件。这个文件可以放在项目的根目录下,用于…

借还款管理神器,高效记录借还款信息,让财务明细不再遗漏

在快节奏的现代生活中,借还款管理成为我们日常财务处理的重要一环。无论是个人生活还是企业运营,都需要一个高效、准确、便捷的方式来记录和追踪借还款信息。传统的记账方式往往容易出错、繁琐且耗时,难以满足现代人的需求。现在,…

HarmonyOS应用开发实战 - Api9 拍照、拍视频、选择图片、选择视频、选择文件工具类

鸿蒙开发过程中,经常会进行系统调用,拍照、拍视频、选择图库图片、选择图库视频、选择文件。今天就给大家分享一个工具类。 1.话不多说,先展示样式 2.设计思路 根据官方提供的指南开发工具类,基础的拍照、拍视频、图库选照片、选…

【Python爬虫】将某网页中表格里的十六进制颜色值转换成十进制,再生成新表格

【需求】 在 https://www.cnblogs.com/heyang78/p/5712076.html 上有360种颜色及代码,但很遗憾没有十进制的RGB值,使用时需要自己转换一下,此过程依赖网络或计算器,颇为不便。因此,拟设计一爬虫将原有表格内容取出&am…

dynamic动态数据源编码切换数据源

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 dynamic特性 支持…

D盘满了怎么清理?3种操作方法快速释放空间!

“我平常使用电脑时,为了不让c盘压力太大,会将大部分文件都保存在d盘上,但是我的d盘用着用着就满了,有什么比较简单的d盘清理方法吗?请大家分享一下吧!” 在使用电脑的过程中,D盘作为重要的存储…

【网页实战项目设计】基于SSM的医院预约挂号系统

基于SSM的医院预约挂号系统 项目截图 开发环境与技术框架 开发语言:Java 框架:ssm 技术:JSP JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具&a…