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

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

12. 协议讲解

12.1 应用层
12.1.1 功能
  • 负责应用程序之间的数据沟通。
12.1.2 协议

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

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

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

  • 首行
  • 请求首行
  • 请求方法
    GET/POST/HEAD/PUT/DELETE
  • URL
    完整的url元素
    域名
    http://username:password@www.baidu.com: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);

4. 获取已完成连接
5. 通过获取的已完成连接socket接收数据
6. 通过获取得已完成连接socket发送数据
7. 关闭套接字

  • int close();

(2)TCP三次握手
为什么三次

  1. 三次握手建立连接,是为了确保通信双方都有收发数据的能力;
  2. 两次不安全:状态迁移变化,确保服务端不会为迟到的重复SYN建立连接,并且服务端不能保证客户端具有收发数据的能力;
  3. 四次没必要:SYN和ACK只是两个标志位, 没必要分成两个报文进行发送。

握手失败

  • 服务端等待最后一个ACK报文超时后,向客户端回复RST报文, 然后关闭释放socket,避免SYN泛洪攻击。

(3)TCP四次挥手**
为什么四次

  • 因为被动关闭方收到FIN请求报文后, 立即进行ACK回复,接下来需要等待用户调用close接口进行确认,缓冲区中的数据已经处理完毕 (不关心这些数据了),才会向对方发送FIN请求报文,得到ACK回复后,则直接释放socket,因此被动关闭方的ACK和FIN不能直接放在一起进行回复。

(4)TIME_WAIT
假设没有 TIME_WAIT状态 有什么用?

  • 1.可能会接收到对方重发的FIN请求,对新连接造成影响;
  • 2.向被动关闭方发送SYN请求的时候,对方有可能处于Last_ACK等待最后一次回复,会认为数据中标志信息错误,复RST重置连接报文,要求重新建立连接,对新连接造成影响;因此要求主动关闭方不能直接关闭,而是等待一段时间:2个MSL(报文的最大生命周期30S)。
  • 3.接收到重发的FIN请求,则进行回复处理;
  • 4.等待网络中后序重发的信息都消失在网络中,不会后序对新连接造成影响;
  • 5.TIME_WAIT状态是为了保护主动关闭方。

(5)保活机制
实现原理

  • 通信双方长时间(7200s)没有数据往来,每隔一段时间(75s)则会给对方发送一个保活探测数据包,要求对方进行回复;
  • 1.若是收到回复,则认为连接正常;
  • 2.若是连续多次(9次)请求都没有回复,则认为连接断开;

连接断开在程序中的体现

  • 1.recv读完所有数据之后,不再阻塞(recv默认没有数据则会阻塞,返回0);
  • 2.send会触发异常–SIGPIPE–默认处理方式–退出进程。

可靠传输

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

避免因为ACK丢失而导致重传

  • 1.每一条数据的确认序号,都需要保证在这序号之前的数据都已经安全到达;
  • 2.若第一条数据没有收到,但是收到第二条数据, 则不能对第二条数据进行确认回复;
  • 3.第一条数据的ACK丢失,但是收到了第二条数据ACK, 则认为第一条数据也已经安全传输;
  • 4.协议字段中的校验和。

提高性能

  • 滑动窗口机制

流量控制

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

快速重传机制

  • 当接收方接收到第二个数据,到那时没有接收到第一条,则认为第一条数据有可能丢失,则立即向发送方发送第一条数据的重传请求,并且将这个重传请求连续发送三次;发送方连续三次接收到重传请求,则对这条数据进行重传,连续发送三次重传请求是为了避免有可能因为网络阻塞而导致到延迟的数据: <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 以太网协议字段
  • 定义
    “以太网” 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率,例如以太网中的网线必须使用双绞线; 传输速率有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://www.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) 代理服务
  • 代理服务可以部署在任意设备上, 是一个应用层服务, 要求源端先将数据交给自己, 自己再发送给另外一端;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值