OSI(参考模型)将通讯功能划分为 7 个分层, 称作 OSI 参考模型. 层与层之间通过协议传输, 不同层级间依靠接口调用

  • 应用层: 为用用程序提供服务并规定应用程序种通信相关的细节, 包括文件传输, 电子邮件, 远程登录, 等协议.
  • 表示层: 将应用处理的信息转换为合适网络传输的格式, 或将来自下一层的数据转换为上层能够处理的格式. 主要负责格式的转换.
  • 会话层: 负责建立和断开通信链接(数据流动的逻辑通路), 一级数据的分割等数据传输相关的管理.
  • 传输层: 起着可靠传输的作用. 只在通信双方节点上进行处理, 而无需在路由器上处理.
  • 网络层: 将数据传输到目标地址. 目标地址可以是多个网络通过路由器连接而成的某一个地址, 因此这一层主要负责寻址和路由选择.
  • 数据链路层: 负责物理层面上互连的, 节点之间的通信传输. 数据帧的生成(数据帧转化为比特流)与接收.
  • 物理层: 负责比特流与数据帧的转换;

OSI 是理论上的网络通讯模型, 通常我们更关注于实际运行的网络协议 TCP/IP 五层模型

image.png

TCP/IP 协议族

TCP/IP协议族可以分为四层:

应用层

  • HTTP(80端口),主要用于普通浏览。
  • HTTPS(443端口),HTTP协议的安全版本。
  • FTP(20和21端口),用于文件传输。
  • POP3(110端口),收邮件用。
  • SMTP(25端口),用来发送电子邮件。
  • SSH(22端口),用于加密安全登陆用。
  • DHCP(67端口,动态主机配置协议),动态配置IP地址。
  • DNS,域名系统,用于完成地址查找,邮件转发等工作(运行在TCP和UDP协议上)。
  • SNMP,用于网络信息的收集和网络管理。

传输层

解决诸如端到端可靠性(数据是否已经到达目的地)和保证数据按照正确的顺序到达这样的问题。
TCP、UDP都是传输层协议。
**

网络层

解决在一个单一网络上传输数据包的问题。

IP 协议
ICMP(控制报文协议, 传递网络通不通、主机是否可达、路由是否可用等网络本身的消息, ping 命令就是基于 ICMP 协议)

数据链路层

数据包从一个设备的网络层传输到另外一个设备的网络层遵循的规范。

ARP(地址解析协议, 根据 IP 地址获取物理(MAC)地址), RARP(反向地址转换协议, 物理地址转换为 IP 地址)
以太网协议
Wi-Fi协议

对应设备:

  • 数据链路层: 网桥, 二层交换机, 网卡(同时工作于物理层和数据链路层)
  • 网络层: 路由器, 三层交换机(核心交换机)

路由器与交换机(二层)的区别:

  • 路由器工作在网络层
    • 通过 IP 地址寻址, 支持 TCP/IP 协议
    • 支持划分子网
    • 可以连接不同的网络(跨网段)
  • 二层交换机工作在数据链路层
    • 通过 MAC 地址寻址
    • 不能通过 MAC 划分子网
    • 用于同一网段内的数据交换

TCP 特点

  • 基于点对点的连接:传输数据前需要建立好连接,然后再进行传输
  • 双向通信:TCP 连接建立后,就可以在连接上进行双向的通信
  • 基于字节流而非报文
  • 可靠传输:将数据按照字节大小进行编号,接收端通过 ACK来确认收到的数据编号,通过这种机制 TCP 协议能够保证接收数据的有序性和完整性
  • 可以提供流量控制能力:通过滑动窗口来控制数据的发送速率,滑动窗口的本质是动态缓冲区,接收端根据自己的处理能力在 TCP 的 Header 中动态调整窗口大小,通过 ACK 应答包通知给发送端,发送端根据窗口的大小调整发送的速度。
  • 拥塞控制

三次握手建连

TCP 在传输上是双工传输,不区分 Client 端与 Server 端,为了便于理解,
把主动发起请求的一端称作 Client 端,被动建立连接的一端称作 Server 端

建立连接前需要 Server 端先监听端口

1.客户端发一个 SYN 同步包,发送后客户端状态为 SYN_SENT 状态

2.Server 端收到 SYN 后同意建立连接,回复客户端一个 ACK;
由于 TCP是双工传输,Server 端也会向 Client 端发送一个同步请求SYN
发送后 Server 端为 SYN_RCVD 状态

3.Client 端收到来自 Server 端的 ACK 后,状态就变为 ESTABLISHED,同时向 Server 端发送 ACK 响应
Server 端接受到 ACK 后状态也变为 ESTABLISHED
image.png
这三步简单来说就是
申请 同意申请并申请 同意申请

四次挥手断连

1.Client 端先发起 FIN 断开连接请求,Client 进入FIN_WAIT_1 状态
2.Server 端收到 FIN 请求后,返回 ACK,进入 CLOSE_WAIT 状态, Client 端收到 ACK 后进入 FIN_WAIT_2状态。此时 Server 属于半关闭状态,因为此时 Client 端已经不会再向 Server 端发送数据,但是Server 可能还有数据需要发送。
3.当 Server 端发送数据完毕后,Server 端会向 Client 端发送 FIN,表示 Server 端也没有数据要发送了,此时Server 进入 LAST_ACK 状态
4.Client 端收到 Server 端的 FIN 后回复 ACK, Server 端接受到 ACK 直接进入 CLOSED 状态。 Client 端在回复后不会立刻关闭,而是进入 TIME_WAIT 状态,并等待两倍的 MSL,来保证连接的可靠关闭,之后才会进入 CLOSED 状态。

image.png

为什么要等待两倍的 MSL?

1.保证 TCP 连接可靠关闭
2.保证连接中重复的数据段能够从网络中消失,防止端口被重用的时候,可能会产生数据混淆

为什么断连的时候需要四次?

因为断开连接时,两个端数据发送的停止时间可能不同,无法合并 FIN 和 ACK 发送。