LWIP_TCP 协议

目录

1 TCP 协议简介

1.1 TCP 协议简介

1.2 TCP 的建立连接

1.3 TCP 终止连接

1.4 TCP 报文结构

 1.5 lwIP 的 TCP 报文首部数据结构

1.6 lwIP 的 TCP 连接状态图

 


1 TCP 协议简介

1.1 TCP 协议简介

        TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

        TCP 为了保证数据包传输的可靠行,会给每个包一个序号,同时此序号也保证了发送到接收端主机能够按序接收。然后接收端主机对成功接收到的数据包发回一个相应的确认字符( ACK, Acknowledgement),如果发送端主机在合理的往返时延( RTT) 内未收到确认字符ACK,那么对应的数据包就被认为丢失并将被重传。 TCP 协议,它是基于连接的一种传输层协议,在发送数据之前要求系统需要在不可靠的信道上建立可靠连接,我们称之为“三次握手”。 建立连接完成之后客户端与服务器才能互发数据, 不需要发送数据时,可以断开连接,这里我们称之为“四次挥手”。

1.2 TCP 的建立连接

        握手之前主动打开连接的客户端结束 CLOSED 阶段,被动打开的服务器端也结束CLOSED 阶段,并进入 LISTEN 阶段。随后开始“三次握手”:

① TCP 服务器进程先创建传输控制块 TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了 LISTEN(监听)状态。

② TCP 客户进程也是先创建传输控制块 TCB,然后向服务器发出连接请求报文,这是报文首部中的同部位 SYN=1,同时选择一个初始序列号 seq=x ,此时, TCP 客户端进程进入了SYN-SENT(同步已发送状态)状态。 TCP 规定, SYN 报文段(SYN=1 的报文段)不能携带数据,但需要消耗掉一个序号。

③ TCP 服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该ACK=1, SYN=1,确认号是 ack=x+1,同时也要为自己初始化一个序列号 seq=y,此时, TCP服务器进程进入了 SYN-RCVD(同步收到)状态。这个报文也不能携带数据,但是同样要消耗一个序号。

④ TCP 客户进程收到确认后,还要向服务器给出确认。确认报文的 ACK=1, ack=y+1,自己的序列号 seq=x+1,此时, TCP 连接建立,客户端进入 ESTABLISHED(已建立连接)状态。 TCP 规定, ACK 报文段可以携带数据,但是如果不携带数据则不消耗序号。

当服务器收到客户端的确认后也进入 ESTABLISHED 状态,此后双方就可以开始通信了。这就是“三次握手”的过程,如下图所示。

1.3 TCP 终止连接

        建立一个连接需要三次握手而终止一个连接需要四次挥手,终止连接有以下过程。

(1) 第一次挥手:客户端发送释放报文,并停止发送数据。释放数据报文首部, FIN=1,其序列号为 seq=u,此时,客户端进入 FIN-WAIT1(等待服务器应答 FIN 报文)。

(2) 第二次挥手:服务器收到客户端的 FIN 报文后,发出确认报文 ACK=1、 ack=u+1,并携带自己的序列号 seq=v。此时,服务器进入 CLOSE-WAIT(关闭等待) 状态。客户端收到服务端确认请求,此时,客户端进入 FIN-WAIT2(终止等待 2)状态,等待服务器发送连接释放报文。

(3) 第三次挥手:服务器向客户端发送连接释放报文 FIN=1、 ack=u+1,此时,服务器进入了 LAST-ACK(最后确认)等待客户端的确认。客户端接收到服务器的连接释放报文后,必须发送确认 ack=1、 ack=w+1,客户端的序列号为 seq=u+1,此时,客户端进入 TIME-WAIT(时间等待)。

(4) 第四次挥手:服务器接收到客户端的确认报文,立刻进入 CLOSED 状态。

这四次挥手就是终止 TCP 协议连接,如下图所示:

1.4 TCP 报文结构

        在传输层中, TCP 的数据包称为数据段, TCP 报文段与 UDP 报文段一样都是封装在 IP 数据报中发送。 TCP 首部包含建立与断开、数据确认、窗口大小通告、数据发送相关的所有标志和控制信息, TCP 报文结构如下图所示:

(1) 源、目标端口号字段:占 16 比特。 TCP 协议通过使用”端口”来标识源端和目标端的应用进程。端口号可以使用 0 到 65535 之间的任何数字。在收到服务请求时,操作系统动态地为客户端的应用程序分配端口号。在服务器端,每种服务在”众所周知的端口”( Well-Know Port)为用户提供服务。

(2) 序列号字段:占 32 比特。用来标识从 TCP 源端向 TCP 目标端发送的数据字节流,它表示在这个报文段中的第一个数据字节。

(3) 确认号字段:占 32 比特。只有 ACK 标志为 1 时,确认号字段才有效。它包含目标端所期望收到源端的下一个数据字节。

(4) 头部长度字段:占 4 比特。给出头部占 32 比特的数目。没有任何选项字段的 TCP 头部长度为 20 字节;最多可以有 60 字节的 TCP 头部。

(5) 标志位字段(U、 A、 P、 R、 S、 F):占 6 比特。各比特的含义如下:

① URG: 紧急指针有效。

② ACK: 为 1 时,确认序号有效。

③ PSH: 为 1 时,接收方应该尽快将这个报文段交给应用层。

④ RST: 为 1 时,重建连接。

⑤ SYN: 为 1 时,同步程序,发起一个连接。

⑥ FIN: 为 1 时,发送端完成任务,释放一个连接。

(6) 窗口大小字段:占 16 比特。此字段用来进行流量控制。单位为字节数,这个值是本机期望一次接收的字节数。

(7) TCP 校验和字段:占 16 比特。对整个 TCP 报文段,即 TCP 头部和 TCP 数据进行校验和计算,并由目标端进行验证。

(8) 紧急指针字段:占 16 比特。它是一个偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。

(9) 选项字段:占 32 比特。可能包括”窗口扩大因子”、”时间戳”等选项。

上述的内容讲解的是 TCP 首部信息,这些信息被封装在一个 IP 数据报中, 该数据报结构如下图所示。

 1.5 lwIP 的 TCP 报文首部数据结构

        实现 TCP 协议的文件有 tcp.h、 tcp.c、 tcp_in.c 和 tcp_out.c,这四个文件实现了 TCP 协议全部数据结构和函数, 其中 tcp.c 文件包含了与 TCP 编程、 TCP 定时器相关的函数,而tcp_in.c 文件包含了 TCP 报文段输入处理函数, 而 tcp_out.c 文件包含了 TCP 报文输出处理函数, 当然 tcp.h 定义了宏和结构体。 首先我们看一下 TCP 首部结构,这个结构为 tcp_hdr, 如下源码所示:

struct tcp_hdr {
PACK_STRUCT_FIELD(u16_t src); /* 源端口 */
PACK_STRUCT_FIELD(u16_t dest); /* 目的端口 */
PACK_STRUCT_FIELD(u32_t seqno); /* 序号 */
PACK_STRUCT_FIELD(u32_t ackno); /* 确认序号 */
PACK_STRUCT_FIELD(u16_t _hdrlen_rsvd_flags); /* 首部长度+保留位+标志位 */
PACK_STRUCT_FIELD(u16_t wnd); /* 窗口大小 */
PACK_STRUCT_FIELD(u16_t chksum); /* 校验位 */
PACK_STRUCT_FIELD(u16_t urgp); /* 紧急指针 */
} PACK_STRUCT_STRUCT;

        可见, lwIP 使用 tcp_hdr 结构体描述 TCP 首部各个字段,值得注意的是,该结构体的_hdrlen_rsvd_flags 变量用来描述下图黄色部分的内容。

1.6 lwIP 的 TCP 连接状态图

发送端与接收端发送的指令会进入不同的状态, 因此, lwIP 在 tcpbase.h 文件中定义了枚举类型 tcp_state,它是用来描述 TCP 的状态,该枚举tcp_state 如下源码所示:

enum tcp_state {
CLOSED = 0, /* 关闭状态 */
LISTEN = 1, /* 监听状态 */
SYN_SENT = 2, /* 发送请求连接 */
SYN_RCVD = 3, /* 接收请求连接 */
ESTABLISHED = 4, /* 连接状态已建立 */
FIN_WAIT_1 = 5, /* 程序已关闭该连接 */
FIN_WAIT_2 = 6, /* 另一端已关闭连接 */
CLOSE_WAIT = 7, /* 等待程序关闭连接 */
CLOSING = 8, /* 两端同时收到对方的关闭请求 */
LAST_ACK = 9, /* 服务器等待对方接收关闭操作 */
TIME_WAIT = 10 /* 关闭成功 */
}

如果 TCP 需要建立连接,则系统需要三次握手;如果 TCP 中断连接,则系统需要四次挥手。

 

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

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

相关文章

鸿蒙时间滑动选择器弹窗

例子: Button(打开弹窗).fontSize(14).width(106).height(32).padding({ left: 0, right: 0 }).fontColor(#999).onClick(()>{DatePickerDialog.show({selected:new Date(),onDateAccept:(value)>{AlertDialog.show({ message:JSON.stringify(value) })}})}) …

【豆伴匠】L1-L12更新完,一站式解决文史积累、阅读、写作难题,弯道超车,寒假必备

合抱之木,生于毫末; 九层之台,起于垒土; 千里之行,始于足下。 豆伴匠是什么? 豆伴匠内容包括:人、文、史、作四个模块,全面覆盖文史知识及读写技巧。 目前,豆伴匠有L…

[猫头虎分享21天微信小程序基础入门教程]第21天:小程序的社交分享与消息推送

[猫头虎分享21天微信小程序基础入门教程]第21天:小程序的社交分享与消息推送 第21天:小程序的社交分享与消息推送 📲 自我介绍 大家好,我是猫头虎,一名全栈软件工程师。今天我们继续微信小程序的学习,重…

论文《Visual Point Cloud Forecasting enables Scalable Autonomous Driving》详细解析

论文《Visual Point Cloud Forecasting enables Scalable Autonomous Driving》详细解析 摘要 该论文提出了一种新的预训练任务,称为“视觉点云预测”(Visual Point Cloud Forecasting),从历史视觉输入中预测未来的点云。论文介…

大模型部署推理应用技术浅析

大模型完成预训练后不是就万事大吉了,离推理应用还有很大距离,需要经过微调、部署等一系列工程化工作。尤其是在2B的行业大模型应用中,为解决大模型的幻觉、时效性和推理成本问题,需要建立单一模型之上的体系。模型部署中的技术大…

CyberLink ColorDirector Ultra v12 解锁版安装教程 (视频后期调色软件)

前言 CyberLink ColorDirector Ultra 是一款视频后期调色处理软件,可以给视频进行专业色彩调整,让视频看起来焕然一新。它支持的格式视频非常多,流行的格式全都可以添加到里面进行调色处理,主要是使用关键帧控件进行颜色替换&…

Mac在docker可视化界面上安装主流数据库

前言 篇幅有点长,大家可以打开目录快速跳转到想要的数据库即可! 虽然说用命令行会显得我们更加专业一些,但对于我英语水平不怎么好的人来说,毕竟命令多又长,还不好记。我个人是喜欢复杂问题简单化,踩了很多…

Balabolka-一款完全免费的电子书朗读及文本转语音软件

下载地址:Balabolka Balabolka能够进行简单的文本转语音任务,支持各种语言包,该软件可以读取剪贴板的内容, 可以查看AZW,CHM,DjVu,DOC,EPUB,FB2,LIT&#xff…

想知道股指期货和期权有什么不同吗?

市场上目前有中金所的沪深300ETF,中证500和中证1000股指期货,期权市场有上证50ETF,沪深300etf和中证500ETF期权,股指期货和期权在买卖双方的权利义务、风险收益特征、保证金制度、上市合约数量等方面均有较大区别,下文…

操作系统真象还原:一些你可能正感到迷惑的问题

第0章-一些你可能正感到迷惑的问题 这是我看操作系统真象还原这本书的一些记录: 4 软件是如何访问硬件的 硬件在输入输出上大体分为串行和并行,相应的接口也就是串行接口和并行接口。串行硬件通过串行接口与 CPU 通信,反过来也是&#xff…

连锁收银系统支持带结算功能

连锁实体店的收银系统需要支持结算功能,以适应连锁运营效率和提升连锁管理的水平。商淘云连锁收银系统与您一起分享连锁收银系统需支持结算功能的三大必要点。大家点赞收藏,以免划走后找不到了。 一是,连锁模式的运营比较复杂,有加…

2021CSP-J普及组复赛-第一题:分糖果

2021CSP-J普及组复赛 第一题: 题目: 输入: 7 16 23输出: 6思路: 这是一个简单的思考题,没有用到重要的算法 ①简单的思路即暴力方法就是利用for循环从L 到 R 遍历求出其中最大的奖励值,由于R…

2024最新 Jenkins + Docker实战教程(七)- Jenkins实现远程传输和自动部署

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

论文阅读:Correcting Motion Distortion for LIDAR HD-Map Localization

目录 概要 Motivation 整体架构流程 技术细节 小结 论文地址:http://arxiv.org/pdf/2308.13694.pdf 代码地址:https://github.com/mcdermatt/VICET 概要 激光雷达的畸变矫正是一个非常重要的工作。由于扫描式激光雷达传感器需要有限的时间来创建…

ROS运行文件(LaunchFile)和参数(Parameter)

本文主要介绍ROS的Launch File和Parameter概念,通过Launch File启动单个或多个节点,并通过Parameter配置启动参数。 更多内容,访问专栏目录获取实时更新。 当你的应用中包含了很多工作包,每个工作包了又包含了多个节点时&#xff…

测试基础07:测试工作流程规范、进度同步与把控

课程大纲 1、迭代测试流程 2、测试流程 2.1、测试用例评审 目的:对齐产品需求理解,完善、优化测试场景。 参与方:项目、产品、开发、测试。 用例内容:冒烟用例(主流程) 功能用例。 2.2、冒烟测试 提测…

JAVA类与方法·易错题分析

分析一下作业中关于类与方法写错或者易错的题。 N o . 1 No.1 No.1 下面程序的执行结果是______。 public class Test7 {public static void main(String[] args){new B().display();} } class A{public void draw() {System.out.print("Draw A.");}public void di…

PHPSTOM配置Laradock,xdebug,phpunit

原理图: 片面理解: phpstorm启用一个9000端口,这个端口用来接收到信息后,启用xdebug功能。服务器端(docker), 当客户端访问laravel项目域名后, 并读取xdebug.ini的配置, 把调试的请求数据, 向配置里面的端口发送消息, 配置里面的端…

这个橙子真的香!老司机徒手把玩香橙派Kunpeng Pro事后回忆录

说!你是哪个门派? 香橙,芸香科柑橘属小乔木。枝通常有粗长刺,新梢及嫩叶柄常被疏短毛。叶厚纸质,翼叶倒卵状椭圆形,顶部圆或钝。。。 咦?小李?我们不是搞IT的嘛,怎么会有…