TCP/IP 协议栈
TCP/IP协议栈并不是一个协议,而是一套分层结构和协议的集合,主要包含四层模型和一些关键协议。
四层模型:
网络接口层(链路层),网络层,传输层,应用层
关键协议:
网络接口层:以太网协议(有线),Wi-Fi协议,MAC地址,ARP协议
网络层:IP协议,ICMP协议,IGMP协议,IPSEC协议
传输层:TCP,UDP
应用层:HTTP/HTTPS,FTP,DNS,SSH
然后逐个的分析
一、网络接口层
负责物理网络的连接,局域网内设备的识别,本地局域网内两个设备之间传输数据帧
我们所看到的以太网(有线),Wi-Fi(无线)还有各种物理传输介质等等都属于网络接口层,可以理解为这个网络接口层是五层模型中物理层和数据链路层的合并,接收物理介质传过来的电磁信号转化为“数据帧”,并将这些设备在物理层面连接起来形成一个局域网。
局域网内设备的识别主要靠MAC地址和ARP协议。
MAC地址是每个设备独一无二的,有12位16进制数,2位一组,共6组,前三组代表制造厂商,后三组是厂商给它的标号,用来在局域网中识别设备。ARP协议在局域网中通过发ARP广播来找到对应IP地址的设备并返回它的MAC地址,有了设备的MAC地址,数据帧才能准确的定位到设备。
ARP协议
https://blog.csdn.net/EGZYQY/article/details/154734053?fromshare=blogdetail&sharetype=blogdetail&sharerId=154734053&sharerefer=PC&sharesource=EGZYQY&sharefrom=from_link
二、网络层
负责网络间的IP地址逻辑寻址和路由转发,负责将数据报从源主机跨网络路由到目标主机,就是根据IP地址找到对应的局域网然后交给网络接口层了,主要是在寻址过程中的各种路由器,它们是怎么样讲IP数据包路由出去的,路径是如何选择的等等
数据包走哪条路能到达目标机器?
主要协议:
IP,ICMP,动态路由协议(OSPF,RIP,BGP),ARP,DHCP
IP协议:网络层最重要的协议,定义IP地址(IPv4,IPv6),封装IP数据包,明确源IP、目标IP
无连接,不可靠,只负责“寻址和转发”,有问题靠上层tcp负责
ICMP协议:网络故障诊断,错误反馈,IP协议的辅助工具。不传输用户数据,只传递控制信息。
应用:ping(检测设备是否可达),traceroute(追踪数据包转发路径),日常网络排 除故障
动态路由协议 :让路由器自动交换路由信息,动态生成/更新路由表,无需手动配置
ARP协议:将网络层的IP地址转换成MAC地址(逻辑地址到物理地址的转换),仅在本地广播域 (直连链路/局域网)内生效
DHCP协议:自动给网络设备分配IP地址、子网掩码、网关、DNS等网络配置,避免手动设置的麻 烦,动态分配IP地址可回收复用,几乎所有网络都依赖DHCP分配IP
各协议核心价值:
- IP:负责 “跨网寻址 + 数据包封装”(必备);
- ICMP:负责 “故障诊断 + 错误反馈”(排障必备);
- 动态路由协议:负责 “路由表自动更新”(中大型网络必备);
- ARP:负责 “IP 转 MAC”(本地传输必备);
- DHCP:负责 “IP 自动分配”(日常使用必备)。
三、传输层
端到端的通信、可靠性保证(TCP)、传输控制(控制传输速率,拆分数据)
数据应该交给对方的哪个程序?需要保证可靠性吗?
两个核心协议:
TCP:面向连接、可靠传输、有序交付、流量控制、慢启动
确保数据 “不丢、不重、不乱”,适合对可靠性要求高的场景
网页(HTTPS/HTTP)、文件传输(FTP)、邮件(SMTP)、聊天(微信文字)、转账支付
三次握手:
1.客户端发送请求数据包 SYN=1,seq=x
2.服务端回应SYN=1,ACK=x+1,seq=y
3.客户端回应 ACK=y+1
SYN表示请求连接
三次而不是两次的原因:为了防止一个滞留在互联网旧的已经无效的请求突然到达服务器占用资源,只有客户端再次回应了这个连接才是有效的
传输数据......
四次挥手
1.客户端:FIN=1,seq =m,ACK=上一个服务器序号请求序列+1
等待关闭,客户端状态:FIN-WAIT-1(终止等待1)
2.服务端:ACK= m+1
收到请求,继续可能未发送完的数据,服务器状态:CLOSE-WAIT(关闭等待)
收到 ACK后客户端状态:FIN-WAIT-2(终止等待2)
3.服务端:FIN=1,seq=随机序号
准备好关闭连接,服务器状态:LAST-ACK(最后确认)
4.客户端:ACK=随机序号+1
客户端收到服务器的FIN,发送一个ACK,客户端状态:TIME-WAIT等待一段时间彻底关闭
FIN表示请求关闭
为什么有 TIME-WAIT 状态?
-
可靠地终止连接:确保最后一个 ACK 能到达服务器。如果 ACK 丢失,服务器会重发 FIN,客户端在 TIME-WAIT 状态下还能再次回复 ACK。
-
让旧连接的数据包在网络中消散:防止之前连接的迟到的数据包被新建立的、相同四元组(源IP、源端口、目标IP、目标端口)的连接错误地接收,在这段时间里,旧连接的迟到数据包会被网络丢弃或直接拒绝,新连接就算用了相同四元组,也不会收到这些 “垃圾数据”
在同一次的TCP连接中,序号是一直随着发送数据而改变的,除了四次挥手后服务端的FIN生成的随机数,其他的都是继承了三次握手的客户端和服务端生成的随机序号x,y

(忘了在哪看见的一张图片,感觉非常好)
UPD:无连接、不可靠传输、无排序、速度快、开销小
追求传输效率,允许少量丢包,适合实时性要求高的场景
视频通话、语音聊天(如 Zoom)、直播、游戏、DNS 查询、物联网数据上报
四、应用层
直接为用户和应用程序提供通信服务,定义应用程序与网络的交互规则(数据格式,请求/响应方式),处理业务逻辑(文件传输,邮件收发,网页展示),屏蔽底层协议的复杂性,给应用程序提供简单易用的接口
传输什么数据?用什么协议?
HTTP(超文本传输协议):普通网页传输的核心协议
HTTPS:HTTP的加密版本,通过SSL/TLS加密,用于安全需求较高的场景(现在基本都是)
在HTTP通过TCP三次握手建立连接后再通过TLS握手建立安全通道实现加密传输
FTP:(文件传输协议):传统的文件上传下载协议,常用语服务器文件管理
SFTP:(SSH文件传输协议):FTP的加密版,基于SSH协议,安全性更高,已经基本代替FTP
TFTP:(极简版文件传输协议):极简版文件传输协议,无登录验证,速度快
DNS(域名系统):域名解析,由域名找到IP地址,如果缓存表中没有,会向上一级DNS请求
数据的自上而下封装和从下到上的解封过程
封装
应用层:产生数据
传输层:TCP头(源、目的端口等)+ 数据 形成 “TCP段/UDP数据报”
网络层:IP头部(源、目的IP地址) + TCP段 形成“包/数据报(UDP)”
网络接口层:帧头部(源、目的MAC地址) + IP包 + 帧尾部(差错检验等) 形成 “帧”
(物理层)帧---->比特流
这个数据帧在本地网络被路由器接收,路由器拆开帧头部,查看目标IP地址,然后根据路由表决定下一个目的地,重新封装成新的数据帧,这个过程反复进行直到数据报到达目标网络。
接收
网络接口层:从网线接收比特流,重组为数据帧
查看帧的目的MAC地址是不是发给自己的
拆掉帧头部尾部,将IP包上交给网络层
网络层:查看IP包里的,目的IP地址确定是发给自己的
拆掉IP头部,将里面的TCP段上交给传输层
传输层:查看IP包的目的端口
确定应该由哪一个应用程序来接收
去掉TCP头部,将原始数据上交给应用层
应用层:Web服务器程序接收到这个数据,理解并处理
