当前位置: 首页 > news >正文

TCP协议报文

前言

TCP/IP协议簇——打开虚拟世界大门中,已经给大家大致介绍了TCP/IP协议簇的分层。

TCP (Transmission Control Protocol)传输控制协议,在TCP/IP协议簇中,处于传输层。是为了在不可靠的互联网络(IP协议)中,提供可靠的端到端字节流传输而专门设计的传输协议。

图片

不可靠的IP协议

IP协议是链路层协议,协议设计的目的是为了让主机和主机能高效地进行路由和数据传输。IP协议为了追求网络的灵活性和可扩展性,只负责将数据进行路由和转发,不保证数据传输的完整性,顺序性和可靠性。

IP协议发送数据前,不会建立任何直接的连接通信,因此数据包和数据包之间独立没有关联,数据包之间也就没有顺序性。IP数据包在传输中,可能丢失,重复,乱序或损坏,IP协议也没有提供任何机制来检测数据传输的正确性。

TCP协议以IP协议作为数据传输的基础,在此基础上通过自身的协议特性,保证了数据传输的完整性,顺序性和可靠性。

TCP报文内容

图片

源端口

发起方的端口号,16字节,取值范围0 ~ 2^16 - 1(即,65535)

目的端口

接收方的端口号,16字节,取值范围0 ~ 2^16 - 1(即,65535)

注:系统端口号范围限制,就是因为TCP报文中端口号的字节限制

序号

每个数据包都有一个唯一的序列号(Sequence Number),用于标识数据包在数据流中的位置。发送数据包时数据比较大时则需要分片,序号则用来区分不同的分片并排序,确保了数据的顺序性,32字节。

确认号

确认数据是否被收到,一般为收到的序号值+1,32字节。

数据偏移和保留位

数据偏移,TCP报文头部长度,即报文的数据区距离报文起始位置的长度,4字节为单位,4位,取值范围0~15,比如值为5,即表示长度为5*4=20。

保留位,为新功能或者扩展时使用,3位,取值范围0~7,一般为0以兼容现有的TCP协议。假设需要对TCP协议进行扩展,保留位设置不为0,则旧协议无法识别新的协议报文。

数据偏移和保留位共占1字节,即8位。

控制位

6个控制位,URG, ACK, PSH, RST, SYN, FIN,只有0,1两种状态,默认为0,需要使用时则置为1。

URG(Urgent):紧急指针位,值为1时,表示数据是紧急数据有高优先级,优先传送,而不按照原先的队列顺序传送。

ACK(Acknowledgment):确认号是否有效,值为1时,表示确认号字段中包含了对方期望收到的下一个序号。

PSH(Push):表示是否立即传送数据,如果设置了该标志,数据将被立即传送给应用程序,而不是等待缓冲区填满。

RST(Reset):表示重置连接,如果设置了该标志,表示意外情况发生,需要中止连接。

SYN(Synchronize):表示同步序列号,用于建立连接时,用来同步双方的序列号。

FIN(Finish):表示结束连接,用于关闭连接时,用来表示数据传输已经完成。

窗口

16位长,表示该报文的发送方能接受的字节数,即窗口大小,传输过程中双方可以动态调整窗口大小,即用来控制数据传输速率。一个TCP数据包大小,最大则为65535(2^16-1)字节,除去头部20字节,理论上可携带的最大数据量为65515字节。

校验和

16位长,用于校验数据是否有差错,数据发送发根据伪首部、TCP头部和TCP数据部分进行计算得出校验和,接收方在根据同样的计算方式计算校验和,并与报文中的校验和对比,判断数据是否有差错。

紧急指针

16位长,表示紧急数据在TCP数据中的偏移量,只在TCP头部的URG标志位被设置为1时才有效,否则会被忽略。紧急指针的使用不是很常见,因为它需要在TCP数据中插入特殊的标记,可能会影响数据传输的效率。

选项字段

可选字段,无固定长度,用于在TCP头部中传输一些额外的控制信息,使TCP协议更加灵活,但同时也会增加TCP头部的长度,从而增加了数据传输的开销。

总结

从上面可以看出,TCP协议支持数据分片传输,在数据传输中会通过校验和检验数据是否有差错,并决定是否需要重复,保证了数据的完整性;通过窗口参数控制了数据传输的速率以适配不同主机之间的不同传输速率;通过序号和确认号保证了数据传输的顺序性。

http://www.lryc.cn/news/151070.html

相关文章:

  • C# 如何将使用的Dll嵌入到.exe应用程序中?
  • 【LeetCode】剑指 Offer Ⅱ 第5章:哈希表(6道题) -- Java Version
  • x86 汇编手册快速入门
  • WPF C# Binding绑定不上的解决情况
  • 【UE 材质】实现方形渐变、中心渐变材质
  • PHP旅游管理系统Dreamweaver开发mysql数据库web结构php编程计算机网页
  • java内存模型讨论及案例分析
  • 对战ChatGPT,创邻科技的Graph+AI会更胜一筹吗?
  • 9月2日,每日信息差
  • uni-app之android项目云打包
  • C++的智能指针和可变参数模板详解
  • Docker及常用数据库安装
  • 前端使用 JavaScript 检测用户是否在线的6种方法
  • Windows下Redis的安装
  • SpringBoot第45讲:SpringBoot定时任务 - Timer实现方式
  • 01背包(换汤不换药)
  • c++ folly::baton
  • 05.sqlite3学习——DML(数据管理:插入、更新、删除)
  • Netty-ChannelPipeline
  • 从入门到精通,30天带你学会C++【第六天:与或非三兄弟和If判断语句(博主目前最长文章,2514字)】(学不会你找我)
  • 如何快速找出占用空间最大的文件?
  • 算法:分治思想处理归并递归问题
  • 小白学Go 基础02-了解Go语言的诞生与演进
  • python中如何将十进制转成二进制
  • 数据结构--5.0.1图的存储结构
  • 解决win10 wsl子系统安装的ubuntu环境中lsof,netstat命令查看端口没有任何输出的问题
  • 【OpenFeign】OpenFeign结合Hystrix和Sentinel实现熔断降级
  • 软件工程(十) 需求工程之需求开发与管理
  • C++网狐服务器引入开源日志库spdlog
  • 【C++】—— c++11之智能指针