操作系统与网络 (12. 协议讲解)

人总是在接近幸福时倍感幸福,在幸福进行时却患得患失!

12. 协议讲解

12.1 应用层

12.1.1 功能

负责应用程序之间的数据沟通;

12.1.2 协议

(1) 自定制协议
结构化数据传输

  • 序列化
    将数据对象按照指定的协议组织成为能够进行持久化存储, 数据传输的二进制数据串.
  • 反序列化
    将二进制数据串按照指定的协议解析得到各个数据对象.

(2) 知名协议
HTTP
协议格式

  • 首行
  • 请求首行
  • 请求方法
    GET/POST/HEAD/PUT/DELETE
  • URL
    完整的url元素
    域名
    http://username:[email protected]:80/dir/index.html?uid=1#ch1
    http:// 协议方案名
    username:password 登录信息认证
    www.baidu.com 服务器地址
    80 服务器端口号
    dir/index.html 带层次的文件路径
    uid=1 查询字符串
    ch1 片段标识符
    查询字符串
    格式
    key = val & key = val (键: 就是你存的值的编号;
    值: 就是你要存放的数据)
    urlencode编码/解码
    urlencode编码: 将特殊字符的每个字节, 转化为16进制的数字字符串, 为了表明这两个字符是经过转码后的数据, 因此在字符之前加上%以说明;
  • 协议版本
    0.9/1.0/1.1/2
  • 响应首行
  • 版本号
  • 响应状态码
    1**
    信息状态码
    2**
    200/204/206
    成功状态码
    3**
    301/302/303/307
    重定向状态码
    4**
    400/401/403/404
    客户端错误状态吗
    5**
    500/502/503
    服务器错误状态码
    状态码描述
  • 头部
    格式
    Content-Type: 数据类型(text/html等)
    Content-Length: Body的长度
    Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
    User-Agent: 声明用户的操作系统和浏览器版本信息;
    referer: 当前页面是从哪个页面跳转过来的;
    location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问;
    Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能;
    典型头部
    空行
    功能
    间隔头部与正文
    本质
    \r\n
    正文

12.2 传输层

12.2.1 UDP

(1) 特性

  • 无连接
    只要知道对端的IP和端口号就直接进行传输, 就可以直接发送数据, 不需要建立连接;
  • 不可靠
    没有确认机制, 没有重传机制; 如果因为网络故障该段无法发到对方, UDP协议层也不会给应用层返回任何错误信息(不保证数据安全到达)
  • 面向数据报
    不能够灵活的控制读写数据的次数和数量, 传输层向应用层交付数据的时候只能一整条一整条的交付;
    (2) 协议字段
  • 源端口/目的端口
    负责端与端之间的数据传输
    负责数据传输时由哪一个进程发送出来,到达对端后,应该由哪个进程处理;
  • 16位数据报长度
    决定了面向数据报的特性;
    决定了udp数据报的长度范围;
    0~64k
    包含报头
  • 16位校验和
    负责校验接收的数据与发送的数据是否一致;
  • 二进制反码求和算法

(3) UDP的缓冲区
UDP没有真正意义上的发送缓冲区. 调用sendto会直接交给内核, 由内核将数据传给网络层协议进行后续的传输动作;
UDP具有接收缓冲区. 但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序
一致; 如果缓冲区满了, 再到达的UDP数据就会被丢弃;
(4) 基于UDP的应用层协议
NFS: 网络文件系统
TFTP: 简单文件传输协议
DHCP: 动态主机配置协议
BOOTP: 启动协议(用于无盘设备启动)
DNS: 域名解析协议

12.2.2 TCP

(1) 特性
面向连接
连接管理
状态迁移变化

  • 客户端
    1. 创建 socket 文件描述符
    int socket(int domain, int type, int protocol);
    2. 绑定端口号 (客户端不推荐主动绑定,发送数据的时候能够表述从哪个端口号发送出去,回复数据时就会再回复到这个地址端口上)
    int bind(int socket, const struct sockaddr
    *address,socklen_t address_len);
    3.向服务端发起连接请求
    connect(socketfd,srv_addr,addrlen);
    4.发送数据(将data中dlen长度的数据通过sockfd对应的socket结构中的ip/端口将数据发送到dest_addr地址的主机上)
    sendto(sockfd,data,dlen,flag);
    5.接受数据(从socket对应的socket结构体中的接受队列中取出一条数
    据放到buf中)
    recvfrom(sockfd,buf,dlen,flag);
    6.关闭套接字
    int close();
  • 服务端
    1. 创建 socket 文件描述符
    int socket(int domain, int type, int protocol);
    2. 绑定端口号 (客户端不推荐主动绑定,发送数据的时候能够表述从哪
    个端口号发送出去,回复数据时就会再回复到这个地址端口上)
    int bind(int socket, const struct sockaddr
    *address,socklen_t address_len);
    3. 开始监听(告诉操作系统若是有的新的客户端连接请求过来了,就是
    为这个客户端完成三次握手建立连接的过程);
    backlog: 客户端的最大并发连接数
    listen(sockfd,int backlog);
    5. 获取已完成连接
    6. 通过获取的已完成连接socket接收数据
    7. 通过获取得已完成连接socket发送数据
    8. 关闭套接字
    int close();
  • 三次握手
    流程
    为什么三次
  1. 三次握手建立连接, 是为了确保通信双方都有收发数据的能力;
  2. 两次不安全: 状态迁移变化, 确保服务端不会为迟到的重复SYN建立连接, 并且服务端不能保证客户端具有收发数据的能力;
  3. 四次没必要: SYN和ACK只是两个标志位, 没必要分成两个报文进行发送;
    握手失败
    服务端等待最后一个ACK报文超时后, 向客户端回复RST报文, 然后关闭释放socket, 避免SYN泛洪攻击;
  • 四次挥手
    流程
    为什么四次
    因为被动关闭方, 收到FIN请求报文后, 立即进行ACK回复, 接下来需要等待用户调用close接口进行确认, 缓冲区中的数据已经处理完毕 (不关心这些数据了), 才会向对方发送FIN请求报文, 得到ACK回复后, 则直接释放socket, 因此被动关闭方的ACK和FIN不能直接放在一起进行回复;
    TIME_WAIT
    假设没有TIME_WAIT状态有什么用?
    (1) 可能会接收到对方重发的FIN请求, 对新连接造成影响;
    (2) 向被动关闭方发送SYN请求的时候, 对方有可能处于Last_ACK等待最后一次回复,会认为数据中标志信息错误, 复RST重置连接报文, 要求重新建立连接, 对新连接造成影响;因此要求主动关闭方不能直接关闭, 而是等待一段时间: 2个MSL(报文的最大生命周期30S)
    (1) 接收到重发的FIN请求, 则进行回复处理;
    (2) 等待网络中后序重发的信息都消失在网络中, 不会后序对新连接造成影响;
    (3) TIME_WAIT状态是为了保护主动关闭方;

保活机制

  • 实现原理
    通信双方长时间(7200s)没有数据往来, 每隔一段时间(75s)则会给对方发送一个保活探测数据包,要求对方进行回复:
  1. 若是收到回复, 则认为连接正常;
  2. 若是连续多次(9次)请求都没有回复, 则认为连接断开;
  • 连接断开在程序中的体现:
  1. recv读完所有数据之后,不再阻塞(recv默认没有数据则会阻塞,返回0);
  2. send会触发异常–SIGPIPE–默认处理方式–退出进程.

可靠传输

  1. 面向连接
  2. 确认应答机制
  3. 超时重传机制
  4. 协议字段中的序号/确认序号

避免因为ACK丢失而导致重传
13. 每一条数据的确认序号, 都需要保证在这序号之前的数据都已经安全到达;
14. 若第一条数据没有收到, 但是收到第二条数据, 则不能对第二条数据进行确认回复;
15. 第一条数据的ACK丢失, 但是收到了第二条数据ACK, 则认为第一条数据也已经安全传输;
16. 协议字段中的校验和

提高性能

  • 滑动窗口机制
    流量控制
    通过协议字段中的窗口字段, 通知发送方能够发送的最大数据量, 通过这个来限制对方的发送速度, 避免发送过快, 导致接收缓冲区塞满, 而引起的后序数据包重传拥塞控制发送方维护一个拥塞窗口, 控制一次发送的数据量, 拥塞窗口以慢启动块增长的形式控制传输的数据量, 起到
    对网络进行探测的作用, 可以避免因为网络状况不好而导致的大量丢包;

    快速重传机制
    当接收方接收到第二个数据, 到那时没有接收到第一条, 则认为第一条数据有可能丢失, 则立即向发送方发送第一条数据的重传请求, 并且将这个重传请求连续发送三次; 发送方连续三次接收到重传请求, 则对这条数据进行重传, 连续发送三次重传请求是为了避免有可能因为网络阻
    塞而导致到延迟的数据: <1>停等协议<2>回退N步协议;<3>选择重传协议;通信双方在通信时通过协议字段中的窗口字段协商窗口大小, 告诉对方一次可以发送的最大数据量;

    延迟应答机制
    接收方接收到数据之后, 如果立即进行回复, 窗口大小就会降低, 导致传输吞吐率降低, 降低了发送速度; 这时候如果收到数据之后, 延迟一会进行确认回复, 则有可能用户将缓冲区中的数据取走, 保证传输吞吐率;

    捎带应答机制
    接收方为每一条接收到的数据组织报文, 通过报文头部中的确认序号字段进行确认回复, 这时如果刚好有要给对方发送的数据, 则这次的确认回复序号直接放到要发送的这条数据头中, 可以节省一条空报文的回复, 提高传输效率;

    面向字节流

  • 特性
    传输灵活
    send发送的数据, 会先放到socket的发送缓冲区中, 然后操作系统选择合适
    的时机将数据报发送出去, 多条数据融合成一个大包发送出去, 可以提高一
    定的传输性能;

  • 问题
    粘包问题
    产生原因
    TCP在传输层对数据的格式边界不敏感, 不会替用户区分那条数据从哪
    开始到哪结束, 只关注需要向用户交付多长字节的数据;
    解决方案
    因此粘包问题的解决方案就是用户在应用层进行数据的边界管理
    (1)特殊字符
    (2) 数据定长
    (3)不定长数据在应用头中声明数据长度;

(2) 协议字段

  • 16位源端口/目的端口
    实现端与端之间的数据传输;
  • 32位序号/确认序号
    保证TCP数据的有序交付;
  • 4位首部长度
    表示该TCP头部有多少个32位bit(有多少个4字节); 所以TCP头部最大长度是15 * 4 = 60
  • 6位标志位
    URG: 紧急指针是否有效
    ACK: 确认号是否有效
    PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走
    RST: 对方要求重新建立连接; 我们把携带RST标识的称为复位报文段
    SYN: 请求建立连接; 我们把携带SYN标识的称为同步报文段
    FIN: 通知对方, 本端要关闭了, 我们称携带FIN标识的为结束报文段
  • 16位窗口大小
    用于实现滑动窗口机制;
  • 16位校验和
    发送端填充, CRC校验. 接收端校验不通过, 则认为数据有问题. 此处的检验和不光包含TCP首部, 也包含TCP数据部分.
  • 16位紧急指针
    表示哪部分数据是紧急数据;
  • 40字节选项数据
    用到的时候才会有, 意味着TCP报头长度不固定;

(3) 基于TCP的应用层协议
HTTP(Hypertext transfer protocol): 超文本传输协议
HTTPS: HTTP+SSL/TLS(安全协议)
SSH: 是一种网络协议, 用于计算机之间的加密登录;
Telnet: 网络远程访问;
FTP(File Transfer Protocol): 文件传输协议
SMTP(Simple Mail Transfer Protocol): 简单邮件传输协议

(4) TCP异常情况
进程终止: 进程终止会释放文件描述符, 仍然可以发送FIN. 和正常关闭没有什么区别.
机器重启: 和进程终止的情况相同.
机器掉电/网线断开: 接收端认为连接还在, 一旦接收端有写入操作, 接收端发现连接已经不在了, 就会进行reset. 即使没有写入操作, TCP自己也内置了一个保活定时器, 会定期询问对方是否还在. 如果对方不在, 也会把连接释放.另外, 应用层的某些协议, 也有一些这样的检测机制. 例如HTTP长连接中, 也会定期检测对方的状态. 例如QQ, 在QQ断线之后, 也会定期尝试重新连接.

12.3 网络层

12.3.1 功能

负责地址管理与路由选择, 在复杂的网络通信环境中, 为每一条数据选择一条合适路径进行传输, 而选择路径是根据每一条数据中的目的端地址决定的, 并且路由选择也依托良好的地址管理.

12.3.2 IP协议

1. 基本定义
主机: 配有IP地址, 但是不进行路由控制的设备;
路由器: 即配有IP地址, 又能进行路由控制;
节点: 主机和路由器的统称;
2. 协议字段
4位协议版本, 4位头部长度, 8位服务类型, 16位数据报长度, 16位标识, 3位标志字段,
13位片偏移, 8位生存时间, 16位头部校验和, 32位源端地址和目标地址, 选项字段
3. 地址管理

  • IP地址
    用于唯一标识网络中的一台主机

  • IP的组成
    网路号+主机号
    网络号: 保证相互连接的两个网段具有不同的标识;
    主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;

  • 网段的划分
    早期划分
    分类
    DHCP(自动给子网内新增主机节点分配IP地址)
    A类 0.0.0.0到127.255.255.255
    B类 128.0.0.0到191.255.255.255
    C类 192.0.0.0到223.255.255.255
    D类 224.0.0.0到239.255.255.255
    E类 240.0.0.0到247.255.255.255
    存在问题
    局限性: 大多数组织都申请B类网络地址, 导致B类地址很快就分配完了, 而
    A类却浪费了大量地址;

    现代划分
    CIDR(Classless Interdomain Routing):
    引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;
    本质:
    unit32_t整数,必须由一串连续的二进制1组成,通常用一串 “0” 来结尾;

    作用:

  1. 将IP地址和子网掩码进行 “按位与” 操作, 得到的结果就是网络号;
  2. 子网掩码取反, 可以取到局域网最大主机号, 主机号范围: 0~最大主机号;
  3. 网络号和主机号的划分与这个IP地址是A类、B类还是C类无关;
    IP: 192.168.122.132 NetMask: 255.255.255.0 IP&NetMask: 192.168.122.0
    ~NetMask: 255 主机号范围: 0~255 局域网有256个主机
  • 网络中的特殊地址
    将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网, 用于标识一个网络, 不能分配给主机;
    将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包;
    127.的IP地址用于本机环回(loop back)测试,通常是127.0.0.1;
    在一个局域网中能够分配给主机的主机号只有主机号个数-2;
    私有IP地址和公网IP地址
    10.
    ,前8位是网络号,共16,777,216个地址
    172.16.到172.31.,前12位是网络号,共1,048,576个地址
    192.168.*,前16位是网络号,共65,536个地址
    包含在这个范围中的, 都成为私有IP, 其余的则称为全局IP(或公网IP);
12.3.3 ICMP协议 (网络控制协议)

(1) 主要功能
确认IP包是否成功到达目标地址;
通知在发送过程中IP包被丢弃的原因;
ICMP也是基于IP协议工作的. 但是它并不是传输层的功能, 因此人们仍然把它归结为网络层协议;
ICMP只能搭配IPv4使用. 如果是IPv6的情况下, 需要是用ICMPv6;
(2) 报文格式
一类是通知出错原因;
一类是用于诊断查询;
12.4 数据链路层
12.4.1 功能
负责相邻设备之间的数据帧传输, Ethernet

12.4.2 网络层和数据链路层的区别

(1) 网络层的IP地址定位的是网络通信环境中的起点和重点;
(2) 数据链路层的MAC地址定位的是相邻的网络设备网卡;
12.4.3 以太网协议字段
12.4.3 以太网协议字段

  • 定义
    “以太网” 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率,例如以太网中的网线必须使用双绞线; 传输速率有10M, 100M, 1000M等;以太网是当前应用最广泛的局域网技术; 和以太网并列的还有令牌环网, 无线LAN等;
  • 具体内容
    源MAC/目的MAC地址: 定位相邻的设备;
    上层协议: 用于数据分用时选择上层协议;
    CRC: 数据帧尾标识, 校验和;
12.4.4 MAC地址

unit8_t mac[6] 无符号48位的整数,用于标识相邻的设备, 出厂的时候就会设定如何获取相邻设备的MAC地址.

12.4.5 MTU

定义
最大传输单元–数据链路层控制的最大数据帧大小(不包含以太帧头和以太帧尾)
(1) MTU对IP协议的影响
由于数据链路层MTU的限制, 对于较大的IP数据包要进行分包;
(2) MTU对TCP协议的影响
TCP在三次握手的时候就会根据自身的MTU大小协商MSS, 取双方较小的一方作为标准进行传输, 从发送缓冲中取出数据进行发送的时候, 取出的数据不会大于MSS, 因此通常会说:
TCP在传输层自动进行数据分段, 因此不会在网络中进行数据分片;
(3) MTU对UDP协议的影响
UDP协议不会在传输层进行分段, 数据若大于MTU, 则会在网络层进行数据分片, 到达对端
主机后进行分片重组, 一个分片出错, 导致着呢个UDP报文将被丢弃, 分片越多越危险;

12.4.6 MSS

最大数据段大小(应用层数据大小)

12.4.7 ARP协议 (地址解析协议)

(1) 定义
ARP协议是一个介于网络层和数据链路层之间的协议;
(2) 作用
ARP协议建立了主机IP地址和MAC地址的映射关系.
(3) ARP局域网欺骗攻击
伪装ARP请求主机, 向发送端进行响应;
(4) 使用ARP协议获取相邻设备的MAC地址
组织一个ARP请求数据(包含源端MAC+IP+目的端IP)进行广播(目的端
MAC=0XFFFFFFFFFFFF), 相邻的设备都能收到这个ARP请求, 将数据中的目的IP地址和网卡的IP地址进行对比,是否相同;

12.4.8 DNS(域名系统)

(1) 定义
进行域名解析 (通过域名获取服务器IP地址)
(2) 域名服务器的层级划分
根域名服务器–顶级域名服务器–二级域名服务器–三级域名服务器
(3) 域名的层级划分
顶级域名: (.com/.org/.gov/.edu/.us/.jp)
二级域名: (baidu.com/qq.com)
三级域名: (image.baidu.com)
(4) 域名的解析流程
HTTP://mbd.baidu.com
(1) 浏览器缓存查看域名对应关系;
(2) 查看操作系统缓存解析hosts文件;
(3) 本地DNS服务器(根域名服务器,顶级域名服务器,二级域名服务器)
(5) 浏览器输入URL之后回车发生了什么

  • 域名解析流程;
    (1) 组织HTTP请求 (HTTP协议格式);
    (2) 搭建TCP客户端发送HTTP请求;
    (3) 路由选择;
12.4.9 NAT技术

(1) 功能
网络地址转换服务, NAT服务通常部署在网管设备上, 对流经网管的数据进行地址转换, 将数据中的源端地址替换为本机地址, 目的是为了让数据怎么出去响应就怎么回来;
(2) NAT技术的缺陷
无法从NAT外部向内部服务器建立连接;
装换表的生成和销毁都需要额外开销;
通信过程中一旦NAT设备异常, 即使存在热备, 所有的TCP连接也都会断开;
(3) 代理服务
代理服务可以部署在任意设备上, 是一个应用层服务, 要求源端先将数据交给自己, 自己再发送给另外一端;

你可能感兴趣的:(操作系统和网络)