TCP/IP协议解析

TCP/IP协议簇(Transmission Control Protocol/Internet Protocol Suite)是互联网通信的核心架构。由美国国防部(DoD)在ARPANET项目中开发,并制定的一套互联网通信标准协议。此后在互联网的通信中均遵守这套协议体系框架,可以形象的说是互联网相互交流的语言。

一、TCP/IP四层模型

1.网络接口层(Network Interface Layer)

作用:负责数据在不同物理网络中传输。该层不仅负责处理物理接口上的电气协议(RJ45/Wifi),还需对上层的数据进行“帧封装”(添加目的/源MAC地址和置于帧头部,添加CRC校验置于帧尾部)

典型协议:

🏷️以太网(Ethernet)、Wi-Fi(802.11系列),这两个属于物理接口的电气协议

🏷️ARP协议(地址解析协议,通过IP地址查询对应的MAC地址,实现局域网寻址)

数据单元:帧(Frame),该层的数据串通常被称为“数据帧”

数据长度:64~1518字节(不含前导码+SFD)

以太网帧:由“前导码”+“帧开始界定符”+“以太网MAC帧”组成

🏷️前导码(Preamble):由“1010 1010”的交替位组成(即7个字节长度的0xAA),以太网传输采用异步的方式,前导码让接收方确认时钟频率和相位,使收发双方时钟保持一致。

🏷️帧开始界定符(SFD,Start Frame Delimiter):二进制为“1010 1011”(即0xAB),在完成时钟同步后,标记“以太网MAC帧”的起始位置,相当于帧起始符的作用。

💡:前导码和SFD属于物理传输的辅助开销,并不属于以太网帧的有效数据。IEEE 802.3 标准规定,MAC 帧的有效长度为 64~1518 字节(包含 CRC)

🏷️以太网MAC帧(Ethernet MAC Frame):为以太网传输的有效数据,包含目的/自身的MAC地址、数据包类型/长度(值≥0x0600属于类型,值≤0x05DC属于长度)、上层数据包以及CRC校验码

💡:常见数据包类型:IPv4协议(0x0800)、ARP协议(0x0806)、IPv6协议(0x86DD)

💡:MTU(最大传输单元):指单次传输以太网帧所能承载的最大有效载荷。IEEE 802.3标准规定MTU最大长度1500字节,实际的MTU长度也受物理硬件的限制。当数据包超出MTU需要切片分包发送

💡:当MTU不足46字节时,则需要填充数据补足46字节(一般补0)。不过需要注意区分,这是由于以太网MAC帧规定的最小长度为64字节(除去MAC地址、类型以及CRC,最少还需46个字节),而非MTU的规定。所以上层传下来的数据包是有可能小于46字节的,不足部分会在该层补足

2.网络层(Internet Layer)

作用:负责数据在不同的IP网络中传输,跨网络的数据包路由与转发。对上层(传输层)的数据进行“IP封装”(添加目的/源IP地址置于包头),通过路由算法(OSPF、RIP)选择最佳路径,将数据从源网络发送至目的网络

典型协议:

🏷️IP协议(Internet Protocol):网络层的核心协议(即IPv4、IPv6),负责数据包的寻址与转发

🏷️ICMP协议(Internet Control Messages Protocol):用于网络诊断(即Ping)

🏷️IGMP协议(Internet Group Management Protocol):管理IP组播

数据单元:包(Packet),该层的数据串通常被称为“数据包”

数据长度:8~1500字节,8字节为网络层协议的最小长度开销(如ICMP和IGMP),1500字节为IEEE 802.3标准规定的MTU长度,实际长度同时也受物理硬件限制

IPv4协议包:

💡:IPv4头部即为所谓的“IP封装”,有效载荷(数据部分)即是传输层的数据内容

🏷️IPv4固定头部格式:

位段

字段名

[0:3]

版本,4 bits

(Version)

表示IP版本,值为4表示IPv4,值为6表示IPv6

[4:7]

头部长度,4 bits

(IHL)

表示IPv4头部长度(含可选头部),单位4字节(即值每增加1,长度增加4个字节),最小值为5(5*4=20为固定头部的长度,是IPv4头部所必需,小于该值,数据包会被丢弃),最大值为15(15*4=60为固定+可选头部的最长长度)

[8:15]

服务类型,8 bits

(ToS)

主要用于区分服务(DiffServ):前6位位DSCP(区分服务代码点),后2位位ECN(显式拥堵通知),用于QoS控制。一般情况下不使用该字段

[16:31]

总长度,16 bits

(Total Length)

整个IP数据包的总长度(固定+可选头部+有效载荷),单位字节。IPv4最大值65535,超出数据丢弃

[32:47]

标识,16 bits

(Identification)

当上层单个数据报超出有效载荷的最大承载量,则需要分片发送,该字段为同属于一数据包的各分片数据唯一标识

[48:50]

标志,3 bits

(Flags)

分片标志位

[0]保留位:为0,保留不使用

[1]DF位:为1表示不允许分片,0允许分片

[2]MF位:为1表示后续还有分片,0表示当前是最后一个分片

[51:63]

片偏移,13 bits

(Fragment Offset)

指当前分片在原始数据报中的偏移位置,单位8字节。如:该值为100(100*8=800),表示该分片起始字节在原始数据的第800字节处

[64:71]

生存时间,8 bits

(TTL)

限制数据包的生存周期,防止无限循环,以“跳数”为单位。每经过一个路由,该值减1,当减到0,路由识别到会将该包丢弃并返回ICMP超市错误。常见值:64(Linux),128(Windows)

[72:79]

协议,8 bits

(Protocol)

表示上层协议类型。常见值:1(ICMP),2(IGMP),6(TCP),17(UDP),89(OSPF)

[80:95]

头部校验和,16 bits

(Header Checksum)

校验IP头部(固定+可选头部),避免头部在传输过程中出现错误。

[96:127]

源IP地址,32 bits

(Source IP Address)

发送方的IPv4地址

[128:159]

目的IP地址,32 bits

(Destination IP Address)

接收方的IPv4地址


🏷️IPv4可选头部格式:

[0:39]

可选字段

(Options)

可选,用于特殊功能(如源路由、记录路由、时间戳等),一般不常使用。最大长度40字节,受头部长度(IHL)最大值15(15*4-20=40)限制

填充

(Padding)

用于补足可选头部的长度,因可选字段(Options)的实际长度是可变的,而头部长度(IHL)的值是以4字节为单位增减。若可选字段不为4字节的整倍数,则需填充“0”使可选头部长度与IHL*4-20相等

3.传输层(Transport Layer)

作用:负责数据传输至目的端口(端口号作用:同一台主机上可能运行着许多应用,不同的应用进程拥有不同的端口,使得传输层知道数据发给具体的应用进程),专业上讲就是所谓的端到端数据传输。定义端口号(0-65535),对上层数据添加端口号,使送到主机上的数据得以区分,以响应不同的应用进程(如HTTP使用80端口,HTTPS使用443端口)。

典型协议:

🏷️TCP协议(Transmission Control Protocol):面向连接的可靠传输,经过“三次握手”建立连接,“四次挥手”断开连接,支持重发、拥堵控制等,适用于文件传输、网页加载等可靠场景

🏷️UDP协议(User Datagram Protocol):无连接的非可靠传输,直接发送数据,不关心对方是否收到,这样做速度快、开销小,适用于实时通信(如视频通话、在线游戏)

数据单元:

🏷️TCP协议:段(Segment),TCP传输协议的数据通常称为“数据段”

🏷️UDP协议:数据报(Datagram),UDP传输协议的数据通常称为“数据报”

数据长度:8~1480字节,8字节为UDP协议的头部数据最小值,1480字节为下层IPv4单次传输的最大有效载荷

TCP协议段:

💡:MSS(Maximum Segment Size,最大报文段大小):用于定义TCP单次传输的的数据部分最大长度(不含TCP头部),最大长度MSS=MTU(最大1500字节)-TCP头部(20字节,无可选头部)-IP头部(20字节,无可选头部)=1460字节。RFC中规定,当TCP连接时双方未协商MSS,则默认使用536字节长度

🏷️TCP固定头部格式:

位段

字段名

[0:15]

源端口,16 bits

(Source Port)

表示发送端的应用进程端口号

[16:31]

目的端口,16 bits

(Destination Port)

表示接收端的应用进程端口号

[32:63]

序号,32 bits

(Sequence Number)

表示当前该数据段中,数据部分第一个字节的序号。一个完整的应用层数据流,每个字节均有一个序号

[64:95]

确认号,32 bits

(Acknowledgment Number)

期望接收到的下一个字节的序号

[96:99]

数据偏移,4 bits

(Data Offset)

表示TCP头部长度(含可选头部),单位4字节(即值每增加1,长度增加4个字节),最小值为5(5*4=20为固定头部的长度,是TCP头部所必需),最大值为15(15*4=60为固定+可选头部的最长长度)

[100:103]

保留,4 bits

(Reserved)

为0,保留不使用

[104:111]

控制位,8 bits

(Control Bits)

也叫标志位(Flags)

104:CWR,拥堵窗口减少标志

105:ECE,ECN-Echo标志

106:URG,紧急指针有效(指示数据段包含紧急数据)

107:ACK,确认号有效(确认已接收到数据)

108:PSH,推送功能(接收方立即将数据给应用层,不进行缓存)

109:RST,重置连接(强制关闭异常连接)

110:SYN,同步序号(建立连接,发送方发送SYN=1的报文)

111:FIN,结束连接(发送方发完所有数据,请求关闭连接)

[112:127]

窗口大小,16 bits

(Window)

接收窗口大小,单位为字节。表示发送该数据报的主机,当前只能接收多少字节的数据量,用于流量控制

[128:143]

校验和,16 bits

(Checksum)

校验整个TCP数据报(TCP固定+可选头部+数据部分,RFC 793还规定校验和需加上伪首部),避免数据在传输过程中出现错误

[144:159]

紧急指针,16 bits

(Urgent Pointer)

表示紧急数据结束位置的偏移值(从序号开始计算),仅在控制位URG=1时生效

💡控制位:RFC 793(1981.9)中规定只有6个控制位,在此之后RFC 3168(2001.9)中,规定增加两个控制位,从保留位中借取位,共8个控制位

💡校验和:关于校验和中提到的伪首部,其长度为12字节(IPv4),包含源IP、目的IP、保留字节0x00、协议、TCP数据总长度(头部+数据,注意不含伪首部)。RFC 793规定计算校验和时,需要将伪首部参与计算,计算时伪首部位于数据串最前端。在实际中,发送方将TCP数据报发出时,会丢弃伪首部;接收方收到数据报后,从传输层提取相关信息,重新生成伪首部参与校验计算。之所以叫“伪首部”,就是其不存在于实际传输过程,仅用于校验计算时临时生成使用。


🏷️TCP可选头部格式:

[0:39]

可选字段

(Options)

可选,用于补充固定头部的信息(如最大报文段长度、窗口扩大银子、时间戳、选择性确认等)。最大长度40字节,受数据偏移(Data Offset)最大值15(15*4-20=40)限制

填充

(Padding)

用于补足可选头部的长度,因可选字段(Options)的实际长度是可变的,而数据偏移(Data Offset)的值是以4字节为单位增减。若可选字段不为4字节的整倍数,则需填充“0”使可选头部长度与Data Offset*4-20相等

4.应用层(Application Layer)

作用:负责直接为用户应用提供服务,定义应用数据格式以及交互逻辑。这里是TCP/IP的最顶层,该层上传输的数据为应用程序真正需要使用到原始数据,主机将这些数据用于不同场景,如文件上传/下载、发送Email、浏览网页等

典型协议:

🏷️HTTP/HTTPS:用于网页浏览(HTTPS是经过CA认证的HTTP)

🏷️FTP(文件传输协议):用于文件传输

🏷️SMTP/POP3/IMAP:用于发送邮件(SMTP)和接收邮件(POP3/IMAP)

🏷️DNS(域名解析协议):用于将域名解析为IP地址

🏷️DHCP(动态主机配置协议):用于自动分配IP、子网掩码、网关、DNS服务器等网络参数

数据单元:数据(Data),该层的数据为原始数据,根据不同应用层协议变化

数据长度:不同的应用层协议数据长度各不相同,若数据超出传输层所能承载的最大数据,传输层会自动将其分包发送,应用层无需过多关心

HTTP应用协议:

🏷️HTTP请求格式:分为三部分,请求行、请求头、请求体

[请求方法] [请求URI] [HTTP版本]\r\n
[头部字段名1]: [值1]\r\n
[头部字段名2]: [值2]\r\n
...
\r\n  // 空行标识头部结束
[请求体] (可选)

1️⃣请求行:也叫首行

组成

示例

请求方法

GET(获取资源)、POST(提交数据)、PUT(更新资源)、DELETE(删除资源)等

请求URL

目的资源路径(/index.html)

HTTP版本

HTTP/1、HTTP/1.1、HTTP/2、HTTP/3

2️⃣请求头:也叫协议头(Header)

组成

示例

指定域名(必需)

Host: www.example.com

客户端标识

User-Agent: Mozilla/5.0

请求体类型

Content-Type: application/json

请求体字节长度

Content-Length: 1024

认证信息

Authorization: Bearer token

......(略)

......(略)

💡:请求头末端需要一行空行与请求体分隔开。HTTP协议未规定具体的请求头键值数目,所以需要以空行告知请求头结束位置。

3️⃣请求体:也叫正文(Body),用于“POST/PUT”等携带数据发送至服务器(如表单、JSON、文件流等)


🏷HTTP响应格式:分为三部分,状态行、响应头、响应体

[HTTP版本] [状态码] [状态描述]\r\n
[头部字段名1]: [值1]\r\n
[头部字段名2]: [值2]\r\n
...
\r\n  // 空行标识头部结束
[响应体]

1️⃣状态行:也叫首行

组成

示例

HTTP版本

HTTP/1、HTTP/1.1、HTTP/2、HTTP/3

状态码

响应的状态码。200(成功)、404(资源不存在)、500(服务器错误)等等

状态描述

状态码的文本说明。如200后跟着的“OK“,404后跟着的“Not Found”等

2️⃣响应头:也叫协议头(Header)

组成

示例

响应数据类型

Content-Type: text/html; charset=utf-8

响应体大小

Content-Length: 2048

设置Cookie

Set-Cookie: sessionId=wind123

缓存控制

Cache-Control: max-age=3600

......(略)

......(略)

💡:响应头末端需要一行空行与请求体分隔开。HTTP协议未规定具体的响应头键值数目,所以需要以空行告知响应头结束位置。

3️⃣响应体:也叫正文(Body),实际返回的数据(如HTML页面、JSON、图片等)

二、TCP/IP封装图(以HTTP为例)

总结:上图为客户端发送HTTP请求到服务端的TCP/IP全过程。HTTP文本经过四层模型层层分装,每一层封装均有自己的责则。应用层HTTP协议用于交互网页信息;传输层TCP添加端口号使得服务端收到数据后清楚该数据属于HTTP服务,大数据量分片发出并记录顺序,校验数据准确性并控制错误重传;网络层IPv4添加IP地址,负责路由寻址,将数据发送至目的网络上;网际接口层添加MAC地址,MAC是设备的唯一标识,使数据准确发送至目的主机(即服务端)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值