目录
第1层 链路/网络接口层—帧(Frame)
1. 链路层功能
2. 常见协议
2.1. ARP(地址解析协议)
3. 常见设备
第2层 网络层—数据包(Packet)
1. 网络层功能
2. 常见协议
2.1. ICMP(互联网控制消息协议)
3. 常见设备
第3层 传输层—TCP段或UDP数据报
1. 传输层功能
2. 常见协议
2.1. TCP
2.2. UDP
3. TCP三次握手与四次挥手
3.1. 名词讲解
3.2. 三次握手
3.3. 数据传输
3.4. 四次挥手
3.5. 整体流程
4. 常见设备
第4层 应用层
1. 应用层功能
2. 常见协议
3. 常见软件
TCP/IP通信流程
1. 发送端
2. 接收端
TCP/IP数据解封装
TCP/IP协议(传输控制协议/互联网协议,Transmission Control Protocol/Internet Protocol)是一组用于计算机网络通信的协议集合,是互联网和许多局域网的基础。它定义了数据如何在网络中传输、寻址、路由和接收。
负责将数据封装成帧,通过物理介质传输,并包括地址解析和物理信号传输功能。
Ethernet(以太网)、Wi-Fi(IEEE 802.11)、PPP(点对点协议)、ARP(地址解析协议)、HDLC(高级数据链路控制协议)
ARP负责在同一局域网内,将网络层的IP地址(IPv4)映射到链路层的MAC地址。作为链路层协议,它为网络层的IP寻址提供支持,通常被视为网络层与链路层的接口协议。
ARP工作流程
如何查看ARP缓存
Linux
查看:arp -n(显示ARP表,不解析主机名)或ip neigh show(显示邻居表,包括ARP和IPv6的NDP)。
添加静态:sudo arp -s 192.168.1.20 BB:BB:BB:BB:BB:BB(MAC地址使用冒号分隔)。
删除:sudo arp -d 192.168.1.20。
Windows
查看:arp -a(显示ARP缓存表)。
添加静态:arp -s 192.168.1.20 BB-BB-BB-BB-BB-BB(MAC地址使用连字符分隔)。
删除:arp -d 192.168.1.20。
注意:Linux使用冒号分隔的MAC地址(如BB:BB:BB:BB:BB:BB),Windows使用连字符分隔(如BB-BB-BB-BB-BB-BB)。
负责将数据从源主机传输到目的主机,即使它们不在同一个网络中。它通过逻辑寻址和路由选择来实现这一点,确保数据包能够跨越不同的网络和子网到达目的地。
ICMP用于差错报告和网络诊断。
注意:ICMP不负责数据传输,仅用于控制和诊断。ICMP报文封装在IP数据包中,由网络层处理。
负责在源主机和目的主机之间提供端到端的通信服务。根据所使用的协议,它可以确保数据的可靠传输(如TCP)或高效传输(如UDP)。传输层通过端口号标识应用程序,并提供流量控制、错误控制和连接管理等功能。
是一种面向连接的、可靠的、基于字节流的传输层协议。
工作机制:通过三次握手建立连接,四次握手断开连接。
场景示例:
应用 |
协议 |
为什么用TCP? |
网页浏览 |
HTTP/HTTPS |
要求完整、顺序、可靠 |
邮件 |
SMTP / IMAP / POP3 |
邮件不可丢 |
文件传输 |
FTP |
数据不可丢 |
SSH远程 |
SSH |
丢包或错包会导致断开连接 |
是一种无连接、不可靠、传输效率高的传输层协议。
场景示例:
应用 |
协议 |
为什么用UDP? |
视频/音频流 |
RTP / VoIP |
一点丢包不影响整体体验 |
DNS |
DNS |
查询快,包小,可靠性交给应用层 |
游戏 |
自定义UDP协议 |
掉一帧画面也能玩 |
Seq:序列号(用于标识发送的数据字节流的顺序)每个 TCP 数据包(或段)都包含一个序列号。
SYN:表示该数据包用于发起连接请求或响应连接请求。
ACK:表示该数据包包含确认信息,用于通知发送方已成功接收某些数据。
FIN:表示发送方已完成数据发送,请求终止连接。
客户端 <------------- 三次握手 -------------> 服务端
| -------------> SYN, Seq=x -------------> |
#客户端发起连接,客户端数据包的初始序列号为x
| <------- SYN+ACK, Seq=y, Ack=x+1 ------- |
#服务端响应客户端的连接请求,并且告知客户端我确认收到了请求。
#服务端数据包的初始序列号为y,希望客户端的下一个数据包使用x+1
| -------> ACK, Seq=x+1, Ack=y+1 --------> |
#客户端响应服务端的连接请求,并告知服务端我确认收到了请求。
#该数据包的序列号为x+1,希望服务端的下一个数据包使用y+1
#连接建立,双方进入ESTABLISHED(连接状态)
客户端 <------------- 数据传输 -------------> 服务端
| -------> Seq=x+1, Ack=y+1 (1 byte) ----> |
#客户端发送1字节数据,希望服务端的下一个数据包使用y+1
#该包的序列号为x+1,这里假设传输的是1字节数据,所以是x+1。
#如果是100字节数据,那就是x+101。x+101是下一个包的起始序列号
| <----------- ACK, Seq=y+1, Ack=x+2 ----- |
#服务端确认收到数据,希望客户端的下一个数据包使用x+2。
#该包的序列号为y+1
客户端 <------------- 四次挥手 -------------> 服务端
| ---------> FIN, Seq=x+2, Ack=y+1 ------> |
# 客户端发送FIN请求断开连接,希望服务端的下一个数据包使用y+1
# 该包的序列号为x+2,延续数据传输后的序列号
# FIN占用一个序列号,类似数据传输的1字节
| <-------- ACK, Seq=y+1, Ack=x+3 -------- |
# 服务端确认收到客户端的FIN,希望客户端的下一个数据包使用x+3
# 该包的序列号为y+1
| <--------- FIN, Seq=y+1, Ack=x+3 ------- |
# 服务端发送FIN请求断开连接,希望客户端的下一个数据包使用x+3
# 该包的序列号为y+1,延续服务端的序列号
| --------> ACK, Seq=x+3, Ack=y+2 -------> |
# 客户端确认收到服务端的FIN,希望服务端的下一个数据包使用y+2
# 该包的序列号为x+3,连接即将关闭
客户端 <------------- 三次握手 -------------> 服务端
| -------------> SYN, Seq=x -------------> |
| <------- SYN+ACK, Seq=y, Ack=x+1 ------- |
| -------> ACK, Seq=x+1, Ack=y+1 --------> |
客户端 <------------- 数据传输 -------------> 服务端
| -------> Seq=x+1, Ack=y+1 (1 byte) ----> |
| <----------- ACK, Seq=y+1, Ack=x+2 ----- |
客户端 <------------- 四次挥手 -------------> 服务端
| ---------> FIN, Seq=x+2, Ack=y+1 ------> |
| <-------- ACK, Seq=y+1, Ack=x+3 -------- |
| <--------- FIN, Seq=y+1, Ack=x+3 ------- |
| --------> ACK, Seq=x+3, Ack=y+2 -------> |
负责为用户应用程序提供网络服务和通信接口。它处理数据的格式化、表示、加密以及会话管理,确保应用程序能够通过网络进行有效通信。
如果按照设备划分的话可分为:
服务器(Server):提供网络服务,如:Web服务器、邮件服务器等
客户端(Client):请求服务的设备:如电脑或手机