OSI参考模型
OSI/RM Open System Interconnection Reference Model
为什么要分层呢?好处是同一层具备相同或相似的功能,不同层次协议或设备具有明显差异。
有利于标准化、降低层次关联性。是一种大而化小的思想。
- 应用层:应用程序与数据
- 表示层:转化为二进制(数据格式变化、数据加密与解密、数据压缩与解压)
- 会话层:建立与维持会话或请求
- 传输层:实现端对端的传输(0-65536端口号优化传输)
- 网络层:逻辑寻址IP
- 数据链路层:( 介质访问控制层MAC+逻辑访问控制层LLC)物理寻址
- 物理层:利用传输介质为数据链路层提供物理联接
封装
封装
达到某一层次之前封装上对应的功能数据 ,让其执行相应的功能

当主机需要传送用户的数据(DATA)时,数据首先通过应用层的接口进入应用层。
- 在应用层,应用的数据被加上应用层的报头(AH),形成应用层协议数据单元,然后通过应用层和会话层的接口数据单元,递交到表示层。
- 同样的,表示层、会话层、传输层、网络层、数据链路层 也都要接收上层递交下来的数据加上自己的报头,分别是PH、SH、TH、NH、DH。
- 其中数据链路层还要加上数据链路层报尾(Data link Termination)同时进行数据较验
- 并组织成数据链路层数据服务单元-帧
- 数据链路层的帧传送到物理层之后,物理层将以比特流的方式 通过传输介质 传输出去。
解封装:

封装组成部分:

TCP/IP
TCP/IP标准模型 | OSI模型 | TCP/IP对等模型 | Protocol Data Unit |
---|
| 应用层 | | |
应用层 | 表示层 | 应用层 | Message |
| 会话层 | | |
传输层 | 传输层 | 传输层 | Segment |
英特网层 | 网络层 | 网络层 | Packet |
⇣ | 数据链路层 | 数据链路层 | Frame |
网络接口层 | 物理层 | 物理层 | Bit |
协议

应用层
协议 | 含义 | 商品 |
---|
Hypertext Transfer Protocol | 超文本传输协议 | TCP 80 |
Hypertext Transfer Protocol Secure | 超文本传输安全协议 | TCP 443 |
File Transfer Protocol | 文件传输协议 | TCP 20/21 |
Secure Shell | 安全外壳协议 | TCP 22 |
Telnet | 远程终端协议 | TCP 23 |
Domain Name System | 域名系统 | TCP/UDP 53 |
Dynamic Host Configuration Protocol | 动态主机配置协议 | UDP 67/68 |
传输层
TCP | UDP |
---|
面向连接协议 | 无连接的协议 |
传输可靠 | 传输不可靠 |
确认 重传 排序 流控 | |
分段 | |
效率低 | 效率高 |
TCP头部

三次握手
A连接 | A标志位 | 序号 | B标志位 | B连接 |
---|
CLOSED | | | | LISTEN |
SYN_SEND | SYN=1 | Seq=x | -> | |
| <- | Seq=y ACKN=x+1 | ACK=1 SYN=1 | SYN_RECV |
ESTABLISHED | ACK=1 | Seq=x+1 ACKN=y+1 | -> | ESTABLISHED |
- 第一次握手:A端(客户端)发送连接请求报文段。
- 将
SYN
置为1,序号(Sequence Number)为x, - A端进入
SYN_SEND
状态,等待B端(服务端)确认。
- 第二次握手:B端 接收到A端发送的
SYN
报文段,现在需要对其确认。
- 设置 确认序列(Acknowledge Number)为序号加1,
ACK
置为1, - 同时发送
SYN
请求信息,序号为y, - 最后将两者放入同一报文段中,一并发给A端,
- B端进入
SYN_RECV
状态,等待A端确认。
- 第三次握手:A端接收到B端的
ACK+SYN
报文。
- 设置序号为x+1(报文的确认序号),
- 同时设置当前确认序号为y+1(报文序号+1),置
ACK
为1。 - 报文发送完毕后,A端与B端都将进入
ESTABLISHED
状态,完成三次握手。
四次挥手
在某些情况下(如连接异常或服务器强制断开),则会同时置RST标志为1
A连接 | A标志位 | 序号 | B标志位 | B连接 |
---|
ESTABLISHED | | | | ESTABLISHED |
FIN_WAIT_1 | FIN=1 | Seq=u | -> | CLOSE_WAIT |
FIN_WAIT_2 | <- | Seq=v ACKN=u+1 | ACK=1 | |
| <- | Seq=w ACKN=u+1 | ACK=1 FIN=1 | LAST_ACT |
TIME_WAIT | ACK=1 | Seq=u+1 ACKN=w+1 | -> | CLOSED |
CLOSED | 2MSL | | | |
- 第一次挥手:A端(即可能是客户端,也可能是服务端)发送结束连接报文段。(表示A端没有数据要发送给B端了)
- 置
FIN
为1,序号为u, - 发送后进入A端进入
FIN_WAIT_1
状态。
- 第二次挥手:B端接收到A端的结束连接报文,现需要对其确认。(即同意A端的关闭请求)
- 置
ACK
为1,确认序号为u加1, - 设置序号为v。
- 发送完成后B端进入
CLOSE_WAIT
状态,A端进入FIN_WAIT_2
状态。
- 第三次挥手:(如B端发送完成所有数据或也没有数据要发送给A端后)B端发送结束确认报文。
- 置
FIN
为1,序号为w。 - 同时置
ACK
为1,确认序号为u+1。 - B端进入
LAST_ACT
状态。
- 第四次挥手:A端接收到B端的结束确认报文,最后再对其确认。
- 设置序号为u+1(结束报文的确认序号),
- 同时置
ACK
为1,确认序号为w+1。 - 发送完成后A端进入
TIME_WAIT
状态,而B端接收完则进入CLOSED
状态。 - A端会等待
2MSL
,如没有新的报文(即证明B端已正常关闭),则A端进入CLOSED
状态。
以太帧

- 前导码:用于数据传输过程中的双方发送与接收的速率的同步。
- SFD:帧起始界定符(Start Frame Delimiter),用于标识一个以太网帧的开始。
- 目的 MAC 地址:指明帧的接收者。
- 源 MAC 地址:指明帧的发送者。
- 长度:2 个字节,指明该帧数据字段的长度,但不代表数据字段长度能够达到 2^16 字节。
- 类型:2 个字节,指明帧中数据的协议类型,比如常见的 IPv4 中的 ip 协议采用 0x0800。
- 数据和填充:包含了上层协议传递下来的数据,如果加入数据字段后帧长度不够 64 字节,会在数据字段加入填充字段达到 64 字节。
- FCS:帧校验序列(frame check sequence FCS)对接收网卡(主要是检测数据与填充字段)提供判断是否传输错误的一种方法,如果发现错误,则丢弃此帧。
- 目前最为流行的用于校验和的算法:循环冗余校验 (cyclic redundancy check CRC)。
流程
如分析一个HTTP请求,按照因特网五层协议,得到的数据流将是:

HTTP报文->TCP段->IP包->以太帧
即是:

参考