OSI & TCP/IP模型设计
OSI七层模型
OSI七层模型(Open System Interconnection)开放式的系统互联
- 物理层(Physical Layer)
职责:负责比特流的传输,也就是数据在物理介质上的传输,如光纤、电缆等。
比喻:想象你在玩“传话游戏”,最底层就是传递信息的基础——纸条。这里的纸条就像是电线或光纤,负责将信息从一个地方传到另一个地方。
关键词:电缆、光纤、无线电波
- 数据链路层(Data Link Layer)
职责:负责在物理层的基础上建立可靠的数据传输机制,包括帧的同步、差错控制和流量控制。
比喻:继续我们的“传话游戏”,这一层相当于你把纸条放在一个信封里,确保信息能够准确无误地到达目的地。如果有人不小心弄丢了信封,你会再发一封。
关键词:MAC地址、帧、差错检测与纠正
- 网络层(Network Layer)
职责:负责将数据包从源端传输到目的端,包括路由选择和逻辑寻址。
比喻:这一层就像是邮政服务,你要寄一封信给远方的朋友。邮政局会根据信封上的地址选择最合适的路线,确保信件能够送到朋友手中。
关键词:IP地址、路由、逻辑地址
- 传输层(Transport Layer)
职责:负责端到端的数据传输,保证数据的完整性,并进行流量控制和拥塞控制。
比喻:想象你正在打包一份礼物,不仅要在外面贴上标签,还要确保礼物完好无损地送到收件人手上。这一层就像快递员,确保包裹安全送达。
关键词:TCP、UDP、端口号、流量控制
- 会话层(Session Layer)
职责:负责建立、管理和终止会话,包括会话管理、同步和恢复等功能。
比喻:这一层就像是电话总机,负责接听来电,帮你建立通话,并在通话结束后挂断电话。它管理着整个对话过程。
关键词:会话管理、同步点、恢复机制
- 表示层(Presentation Layer)
职责:负责数据的表示和转换,包括数据格式化、加密和解密等。
比喻:这一层就像是翻译官,负责将你说的语言翻译成对方能够理解的语言。此外,它还负责确保信息的安全性,就像给你的信件加密一样。
关键词:数据格式化、加密、解密
- 应用层(Application Layer)
职责:提供网络服务给最终用户,包括文件传输、邮件服务、目录服务等。
比喻:这一层就像是邮局的服务窗口,你在这里可以寄信、收信、查询邮件状态等。它是用户与网络服务之间的接口。
关键词:HTTP、FTP、SMTP
总结
OSI七层模型就像是一座高塔,每一层都有其独特的职责,从最底层的物理传输,一直到最顶层的应用服务。每一层的工作都为上一层提供了坚实的基础,从而保证了整个网络通信系统的高效运作。
TCP/IP协议
OSI 模型就像是一个详细的建筑蓝图,定义了每一层的功能和职责,但没有具体的建筑材料和施工方法。而 TCP/IP 协议就像是一个实际的建筑项目,使用了具体的建筑材料(协议)和施工方法(实现),完成了实际的建筑(网络通信)。

OSI是一种理论下的模型,而TCP/IP已被广泛使用,成为网络互联事实上的标准。
层次结构
应用层:提供网络服务,如 HTTP、FTP、SMTP 等。
传输层:负责端到端的通信,如 TCP 和 UDP。
网络层:负责数据的路由和转发,如 IP。
**网络接口层:**负责物理连接和数据传输,如以太网、ARP 等。
TCP&UDP
TCP、UDP区别
TCP(Transmission Control Protocol),是一种面向连接的、可靠的传输层协议,把上面应用层交下来的数据看成无结构的字节流来发送,需要20个字节
UDP(User Datagram Protocol),用户数据包协议,是一个简单的面向数据报的通信协议,只是在其上面加上首部后就交给了下面的网络层,只占用8个字节(64bit)
| TCP | UDP | |
|---|---|---|
| 是否连接 | 面向连接的,需要建立连接,然后再发送数据 | 面向无连接的,不需要建立连接,直接发送数据包 |
| 是否可靠 | 可靠传输,使用流量控制和拥塞控制 | 不可靠传输,不使用流量控制和拥塞控制 |
| 连接对象个数 | 一对一通信 | 支持一对一,一对多,多对一和多对多交互通信 |
| 传输方式 | 面向字节流 | 面向报文 |
| 首部开销 | 首部最小 20 字节,最大 60 字节 | 首部开销小,仅 8 字节 |
| 适用场景 | 适用于要求可靠传输的应用,例如文件传输 | 适用于实时应用(IP 电话、视频会议、直播等) |
TCP的三次握手、四次挥手
- 三次握手

若客户端和服务端一起发送消息? 
- 四次挥手

TCP是否每次连接都需要3次握手?
- TCP快速打开(TCP Fast Open,TFO)
- 第一次握手:
- SYN在fast open带上cookie
- 服务端产生cookie,在ACK返回改cookie给客户端
- 客户端存储cookie 以后:
- 客户端带有cookie
- 服务端验证该cookie,有效,在返回ACK的同时,将数据直接返回给应用层,无效,3次握手
- 少一次ACK的RTT(round-trip time,往返时延)
为什么最后要等2个MSL(Maximum Segment Lifetime,最长报文寿命)
- 确保接收方收到ACK;
- 确保没有新的报文到发送方
HTTP(超文本传输协议)
概述
HTTP(HyperText Transfer Protocol)是一种应用层协议,用于在 Web 浏览器和 Web 服务器之间传输超文本(如 HTML 页面)。HTTP 基于 TCP 协议,确保数据的可靠传输。
特点
无状态:HTTP 协议本身是无状态的,服务器不会保存客户端的状态信息, 我们可以通过Cookie来保存状态。
client-server模型:客户端发送请求,服务器返回响应。
基于 TCP:HTTP 使用 TCP 协议来确保数据的可靠传输。
状态码
- 1XX: 100
continue101http ->websocket请求服务器切换更高的协议 - 2XX: 200 ok 204 只有响应头无body 206:
partial contentHTTP1.1 断点续传、分块下载 - 3XX:301 永久重定向 302 暂时重定向 304 缓存
- 4XX:400 bad request 通用 403 禁止访问 404 无资源 405
method not allowed - 5XX: 500 服务器错误 501 不支持客户端请求 502
bad gateway代理服务器异常 503 太多,无法响应
常见的传输格式内容
- 传输定长、不定长数据
- 定长:Content-length,指定HTTP报文长度
- 不定长:Transfer-Encoding: chunked:表示分块传输,自动忽略Content-Length,建立长链接
- 处理大文件
- Accept-Range: none,允许服务器只发送 HTTP 消息的一部分到客户端,服务器端会返回状态码为 206 Partial Content 的响应:
HTTP/1.1 206 Partial Content
Content-Range: bytes 0-1023/146515
Content-Length: 1024
...
(binary content)- 常见表单
- application/x-www-form-urlencoded:数据会URL编码
- multipart/form-data:常用,不需要编码,每个表单元素独立
HTTP 攻击
SQL
- 通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中
- 处理:对用户的输入进行转义
XSS:(Cross-site scripting)
- 存储型 XSS
- 注入型脚本永久存储在目标服务器上。当浏览器请求数据时,脚本从服务器上传回并执行。
- 反射型 XSS
- 当用户点击一个恶意链接,或者提交一个表单,或者进入一个恶意网站时,注入脚本进入被攻击者的网站。Web 服务器将注入脚本,比如一个错误信息,搜索结果等 返回到用户的浏览器上。由于浏览器认为这个响应来自"可信任"的服务器,所以会执行这段脚本。
- 基于 DOM 的 XSS
- 通过修改原始的客户端代码,受害者浏览器的 DOM 环境改变,导致有效载荷的执行。也就是说,页面本身并没有变化,但由于 DOM 环境被恶意修改,有客户端代码被包含进了页面,并且意外执行。
- 处理:对用户的输入进行转义
**CSRF:(Cross-site request forgery)跨站请求伪造:**攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。
- 一个典型的CSRF攻击有着如下的流程:
- 受害者登录a.com,并保留了登录凭证(Cookie)。
- 攻击者引诱受害者访问了b.com。
- b.com 向 a.com 发送了一个请求:a.com/act=xx。浏览器会默认携带a.com的Cookie。
- a.com接收到请求后,对请求进行验证,并确认是受害者的凭证,误以为是受害者自己发送的请求。
- a.com以受害者的名义执行了act=xx。
- 攻击完成,攻击者在受害者不知情的情况下,冒充受害者,让a.com执行了自己定义的操作。
- 处理:cookie samesite
HTTP 版本
HTTP/1.0
特点
- 短连接:每个请求都需要建立一个新的 TCP 连接,请求完成后立即关闭连接。
- 无状态:服务器不会保存客户端的状态信息。
- 简单头部:只包含基本的头部字段,如 Content-Type、Content-Length 等。
缺点
- 性能差:每次请求都需要建立和关闭 TCP 连接,导致性能低下。
- 无持久连接:无法复用 TCP 连接,增加了延迟和开销。
HTTP/1.1
特点
- 持久连接:允许在同一个 TCP 连接上发送多个请求和响应,减少了连接建立和关闭的开销。
- 管道化请求:允许客户端在同一个连接上发送多个请求,服务器按顺序响应。
- 更多的头部字段:引入了更多的头部字段,如 Host、Cache-Control、ETag 等。
缺点
- 队头阻塞:虽然支持管道化请求,但仍然存在队头阻塞问题,即一个请求的延迟会影响后续请求。
- 头部冗余:每个请求和响应都需要发送完整的头部,导致头部冗余和带宽浪费。
HTTP/2
特点
- 多路复用:允许在同一个 TCP 连接上同时发送多个请求和响应,解决了队头阻塞问题。
- 头部压缩:使用 HPACK 算法压缩请求和响应头,减少了带宽消耗。
- 服务器推送:服务器可以主动推送资源给客户端,减少了客户端的请求次数。
- 二进制分帧:将请求和响应分成更小的二进制帧,提高了传输效率。
缺点
- TCP 队头阻塞:虽然解决了 HTTP 层的队头阻塞问题,但仍然存在 TCP 层的队头阻塞问题。
- 复杂性增加:引入了更多的特性和机制,增加了协议的复杂性。
HTTP/3
特点
- 基于 UDP:使用 UDP 协议,减少了连接建立的延迟。
- 快速重连:在网络切换时,能够快速恢复连接。
- 内置加密:QUIC 协议内置了加密机制,提供更安全的通信。
- 多路复用:在 QUIC 层实现了多路复用,解决了 TCP 层的队头阻塞问题。
缺点
- 兼容性:由于基于 UDP,可能存在一些网络环境不支持 UDP 的情况。
- 部署难度:需要服务器和客户端的支持,部署难度较大。
总结
HTTP/1.0:基本的请求-响应模型,短连接,无状态,性能差。 HTTP/1.1:引入持久连接和管道化请求,提升了性能,但存在队头阻塞和头部冗余问题。 HTTP/2:多路复用、头部压缩和服务器推送,解决了 HTTP 层的队头阻塞问题,但仍然存在 TCP 层的队头阻塞问题。 HTTP/3:基于 QUIC 协议,解决了 TCP 层的队头阻塞问题,提供更快的连接建立和更安全的通信,但兼容性和部署难度较大。
DNS
DNS:将主机名转为具体IP的服务根域:就是一个“.”号,由Internet名字注册授权机构管理。全世界共有13台根域服务器。 顶级域:由Internet名字授权机构管理。共有3种类型的顶级域: 组织域:采用3个字符的代号,如edu、com、gov等。 地理域:采用2个字符的国家/地区代号,如cn、jp、hk等。 反向域:这是一个特殊域,名称为in-addr.arpa,用于将IP映射到域名。 二级域:注册到个人、组织或公司的名称。二级域下还可以创建子域。 主机名:就是FQDN最左边的部分。使用“hostname”命令可以显示当前主机名。
操作过程:递归查询,优先查找是否有DNS缓存 