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是设备的唯一标识,使数据准确发送至目的主机(即服务端)。