(六)Wbe服务器响应消息

老子买那么多书,终于有一本要看完了…

本章看点

  • 服务器概览
  • 服务器的接收操作

一、服务器概览

客户端和服务器的区别

  • 用途不同
  • 网络部分(网卡、协议栈等)相同
  • 用法不同。(一个发起连接,一个等待连接,调用 Socket 库的组件也不同)
  • 客户端程序和服务器程序也不同

服务器程序的结构

分为两个模块,等待连接模块(a)和与客户端通信模块(b)。

  • 程序开始运行时执行 a 模块,这个模块会创建套接字,然后进入等待连接的暂停状态。
  • 客户端发起连接时,a 模块会恢复运行并接受连接,然后启动 b 模块,并转交完成连接的套接字。
  • 每次都会启动一个新的 b 模块,实现多任务。

服务器端的套接字和端口号

  • 客户端收发数据
  1. 创建套接字
  2. 连接
  3. 收发数据
  4. 断开连接
  • 服务器端收发数据
  1. 创建套接字
  2. 将套接字设置为等待连接状态
  3. 接收连接
  4. 收发数据
  5. 断开连接

服务器端的具体操作

  1. 调用 Socket 库创建套接字
  2. 调用 bind 将端口号写入套接字
  3. 调用 listen 进入等待连接状态
  4. 调用 accept 来接受连接
  5. 连接来的时候,创建套接字副本交给与客户端通信的模块,然后继续进入等待连接状态(这里的套接字包含了客户端和服务器的 IP 地址和端口号,因为服务器的一个套接字可能会有多个客户端来连接)

二、服务器的接收操作

接收操作

  1. 信号到达网卡,然后将其还原成数字信号
  2. FCS 校验,出错则丢弃,否则继续
  3. 检查 MAC 头部的 MAC 地址。和自己的不一样就丢弃,否则将数字信息放入缓冲区。(以上步骤由网卡的 MAC 模块完成)
  4. 检查 IP 头部,判断是否是发给自己的
  5. 判断网络包是否分片
  6. 将包转发给 TCP 或 UDP 模块(以上三步由协议栈的 IP 模块完成)

TCP 处理操作

  1. 根据发送方和接收方的 IP 地址和端口号找到对应的套接字
  2. 将数据块拼合起来并保存在接收缓冲区,等待应用程序调用 read 方法来读取数据
  3. 计算 ACK 号,并委托 IP 模块发送给客户端
  4. 向客户端发送断开连接的请求