网络

网络:
  基础概念:
    局域网/城域网/广域网/互联网/因特网
    ip地址:在网络中唯一表示一台主机
    port端口:在一台主机上表示进程
    

    协议:通信双方的约定
    网络协议:网络通信唤醒中数据的约定格式
    通信协议:网络互联的前提
    协议分层:就是一种协议封装,便于使用
    对服务,接口,协议进行明确划分;形成标准实现起来就简单了

    ISO组织:OSI七层参考模型(实现起来比较复杂)
    物理层;链路层;网络层;传输层;会话层;表示层;应用层;
    TCP/IP五层模型:
    物理层;链路层;网络层;传输层;应用层;

    物理层:负责光电信号传输;集线器
    链路层:负责相邻设备之间的数据帧传输;Ethernet(以太网协议);交换机
    网络层:负责地址管理与路由器选择;IP;路由器
    传输层:负责端与端之间的数据传输;TCP;UDP
    应用层:负责应用程序之间的数据沟通;HTTP;FTP;SMTP;DNS

    物理层负责:集线器
    物理层——链路层:交换机
    物理层——网络层:路由器
    物理层——传输层:计算机操作系统

  应用层:负责应用程序之间的数据沟通
    序列化:将数据按照持久化储存或网络数据传输时按指定协议进行排序
    反序列化:对数据持久化储存或网络数据传输时以指定的协议进行解析。
    *调研序列化的种类

    知名协议:http
    URL(网址):统一资源定位符
    协议名称://用户名:密码@服务器地址:服务器端口/资源路径?查询字符串#片段标识符
        127.0.0.1 www.baidu.com
    (C:\Windows\System32\drivers\etc 中的hosts)
    

    URL编码/解码
      因为url中特殊字符都具有特殊含义,因此查询字符串(用户提交的数据)中若由特殊字符存在,则会造成二义性,因此需要字符转换
      为16进制字符串,并且在前方使用表明两个i字符串经过了编码的urldecode,当查询字符串中出现%则认为,后续两个字符时需要进行
      解码的。

    http协议格式:分为三大块
      请求首行, 请求头部, 空行(头部与正文之间由空行间隔), 正文

      首行:(课件上有其他请求方法)
        1.请求首行:请求方法(GET, POST) 资源路径(URL) 协议版本(HTTP/0.9/1.0/1.1/2)
        GET/POST区别:GET提交的数据在url中(有长度限制),而POST所提交的数据在正文中(比较安全, 可进行加密)

        2.响应首行:协议版本 响应状态码 状态码描述
        状态码: 1xx 2xx 3xx 4xx 5xx(课件上详解)
          200(OK), 404(Not Found), 403(Forbidden), 302(Redirect, 重定向), 502(Bad Gateway)

      头部信息:
        由一个个的键值对组成,每个键值对都有其含义和功能
        以\r\n 间隔,每个由key: 开头
        key: val\r\nkey: val\r\n

        Cookie: 向服务器提交保存的认证信息
        Set-Cookie:
        Location:重新请求的浏览器地址
      空行:\r\n
        (当连续遇到两个 \r\n 时表示空行以完)
      正文:...
        http是传输层协议,在传输层使用tcp协议实现,默认端口80
        http是一个短连接,在http1.1中实现了长连接

    http数据解析过程:
      1.获取http头部(首行+头部)
        首行中包含url可以直接知道客户端请求什么资源,GET请求还可以获取到提交的数据
        首行中包含的协议版本:拿到版本就可以针对不同版本的特性进行处理
      2.解析头部
        可以获取正文有多长,正文是什么类型的数据
      3.获取正文进行处理

      问题:如何保证获取的头部信息完整
        MSG_PEEK

  传输层:负责端与端之间的数据传输:TCP/UDP
    端口号:uint16_t 0~65535 0~1023不推荐使用,在一台主机上唯一标识一个进程
    操作系统拿到网卡接收的数据后,通过数据中的端口号就知道数据放在哪一个socket 的缓冲区中
    一个端口号只能被一个进程使用,一个进程可以使用多个端口号

    五元组:一条网络上的数据包含的五条信息:源ip + 端口号 + 目的ip + 目的端口 + 协议

    主机上网络状态的查看:netstat -anptul (课件上详解)

    传输层的传输协议:
      UDP:无连接,不可靠,面向数据报
        面向数据报:每条数据有长度标识,整条发整条收,传输不灵活,但是不会存在粘包问题

        UDP协议包含字段:
          源端口 目的端口 数据报长度 校验和

        源端口/目的端口:传输,确定数据应该哪个进程处理
        校验和:二进制的反码求和
  
        数据报长度:uint16_t
        udp提供整条数据向应用层交付(不会出现半个数据,因为头部中有报文长度标识)
        也正是因为数据报长度在协议头中有标识,因此udp不会产生粘包问题
  
        存储只用了两个字节,意味着UDP数据报最大长度是(64k-8);若sendto给与的数据大于(64k-8)则会报错(用户需要在应用层进行分包)
        因为udp不会在传输层进行数据分段
        若传输的数据大于64k,用户需要在应用层将数据分割成一个个小端进行传输
        udp传输并不保证数据报的有序到达,意味着接收的一方可能会接收到乱序的数据,因此需要用户在应用层进行包序管理

        udp的缓冲区
          发送缓冲区:效果不明显,因为每一次的sentto都会对数据直接封装udp头部,然后交付给网络层
          接收缓冲区:缓冲多条数据如果数据满了,则接下来的数据就会丢失

          优势:传输速度快,自身实现了广播数据包,

        udp实现了传输层的广播数据包

      TCP协议:面向连接,可靠传,输面向字节流(传输控制协议)
        tcp——四次挥手时的TIME_WAIT作用:(这里等待的时间是:两个LSM时间)
        1.假设没有TIME_WAIT 会有什么情况:最后一个ACK丢失
        被动关闭方重新发FIN包,没有等待直接关闭若直接启动的客户端有使用相同的端口信息,则
        有可能受到FIN,对新连接造成影响
        若新启动的客户端使用相同的端口信息,向服务端发送SYN请求,但是服务端因为没有收到最后一个ACK处于LAST_ACK
        状态错误,回复RST报文重置连接,也对新连接造成影响
        因此主动关闭方发送最后一个ACK之后需要等待一段时间
          1.处理若ACK丢失,导致对端重传的FIN包
          2.等待网络中所有双方延迟的报文消失在网络中,不会对后续造成影响


        可靠传输:
          确认应答机制——消耗性能大
          采用超时重传机制(200ms保证数据到达)
          协议字段中的序号/确认序号(保证数据有序到达)

        因为tcp为了实现可靠传输,牺牲了性能,并且有可能因为ack确认应答对视也要重传数据,
        因此提出了以下几种机制来避免大量的丢包重传以及ACK丢失重传来保证不在降低:

          滑动窗口机制:流量控制+ 拥塞控制 + 快速重传机制
            首先通过协议字段的窗口大小,双方进行协商,一次可以传多少条数据,之后等待确认应答,不需要及逆行一一停等

          快速重传机制:
            每条数据的确认回复都会按序回复,若前面的数据没有收到,则不会对后面的数据进行回复(乱序的情况)
            意味着:若收到一条回复,则会认为前面的数据都安全到达,不会因为前面的ack丢失而重传
            若前面的数丢失,则会连续发送三条重传请求,发送完毕后,则确认丢失,将重传数据

          拥塞控制:
            慢启动,快增长(增长是有上限的),若出现丢包现象则重新初始化拥塞窗口。

          流量控制:
            双方协商窗口大小进行流量控制,避免因为窗口爆满而数据丢失

          延迟应答机制:
            接受方不立即确认回复,而是等待一段时间,因为这段延迟的时间内,用户可能已经recive取走数据,窗口就可以尽
            可能的保证最大大小。

          捎带应答机制:
            接收方对每一条的数据的确认回复,都需要发送一个tcp数据报;但是空报头的传输会降低性能,因此考虑在即将要发
            送到的数据报头中包含有确认信息(可以少发一个确认的空报头)

        面向字节流:
          发送方:每次调用send都会将数据放到发送缓冲区中,然后内核选择合适的时机发送数据
          接收方:网卡接收到数据,都会将数据放到缓冲区中,用户recv就是从接收缓冲区取数据
          特性:传输灵活

      粘包问题主要发生的位置:
        1.发送缓冲区中的数据堆积
        2.接收缓冲区中的数据堆积

      本质原因:数传输层对数据之间没有明显的边界划分,tcp只管传输数据的字节流,导致发送端/接收端因为数据的堆积在实际发送或recv时
        一次获取到半条或多条数据

      如何解决粘包问题:(粘包:应用层中的数据包)
        tcp在传输层没有数据边界,但用户可以在应用层进行边界处理
        常见方法:特殊字符间隔(http协议);定长数据(udp头中包含长度);在变长数据中声明长度;

      tcp自身有保活机制,长时间无数据通信,则发送保活探测包,进行链接探测,若多个探测包都没有响应则认为连接断开

  网络层ip:负责地址管理与路由器选择;IP;路由器
    通过对地址的管理能保证数据从一台主机发送到另一台主机并且选择一条合适的路径进行传输

    主机:两端pc
    路由器:实现中间数据转发的设备
    结点:网络中的每一个数据都是一个结点

    为了避免网络IP地址分配冲突,导致二义性
    每个路由器在给自己组件的局域网中的每个主机分配地址时都需要带有自己的局域网标识(网络号与主机号)
      ip地址的组成:192.168.122.132
      网络号:区分网络 192.168.122
      主机号:区分网络内的主机 132
      规定:相邻的网络不能使用相同的网络号

    网段划分:
      早期的网段划分中将整个网络中的ip地址划分成了五类地址
      A类——0~127
      B类——128~191
      C类——192~223
      D类——224~239
      E类——240~247
    因为早期的网段划分方式太过于粗糙,因此被淘汰了,引入了新的方案:CIDR
      子网掩码:子网掩码是由一段连续的二进制1组成
  功能:
    子网掩码与IP地址进行相与则得到网络号:net = ip & mask
    子网掩码取反则可以得到最大的主机号(主机号范围):range = ~mask
    例如:路由器分配给主机的信息

    子网掩码:255.255.255.0
    IP地址:192.168.122.132
    网关地址:192.168.122.1 net = 192.168.122.0

    特殊ip地址: 127.0.0.1-本地回环网卡地址(虚拟网卡)
    用于本地的网络测试

  私网与公网:
    私网与公网的ip的地址划分——RFC1918规定了,用于组建私网的网段只能是以下几种:
    10.*.*.*(通常用于学校,派出所使用——大型局域网)
    172.16.*.* ~ 172.31.*.*
    192.168.*.*(私网地址)

    路由选择:
      路由表算法

    IP协议字段及功能:(课件)
    协议版本:IPV4/IPV6
    4位首部长度:ip长度最大60字节最小20字节
    8位Tos字段:最小延时/最大吞吐量/最高可靠/最小成本
    16位数据报长度:决定了数据有多长 64k -(减) iphdrlen -(减) tcphdrlen/udphdrlen

    与数据分片相关:在链路层中的mtu:最大传输单元,若udp数据大于mtu大小,将会在网络进行数据分片

    16位标识:标识在数据分片中,当前的数分片属于哪一个数据包
    3位标识:其中一位弃用,第二位标识是否禁止分片,第三位标识分片的结束标识
    13位片偏移:进行包序管理,记录了分片在udp数据中的偏移量(按照8个字节来算,有多少个8个字节,一般都是按偶数倍分,奇数出错)


  链路层eth/arp:负责相邻设备之间的数据帧传输;Ethernet(以太网协议);交换机
    MAC地址:网卡上的物理地址,定位相邻的两个设备
      uint8_t mac[6] - 48bit

    以太网(eth协议字段信息):源mac地址,目的mac地址,上层协议类型,数据,帧尾CRC
      问题:传输数据都要传输到相邻设备,如何获取相邻设备的mac地址
      ARP协议:通过IP地址获取MAC地址——全网广播arp请求
      ——介于网络层与链路层之间的协议

      ARP协议获取到对端的mac地址后,会在本机上将ip地址与mac地址的映射关系缓存一段时间(很短)

      mtu:最大传输单元——限制了网卡在传输数据的时候数据的最大长度

        mtu大小不包含以太帧头和帧尾长度
        mss:最大数据段大小——纯粹的应用层数据大小
      数据长度:
        udp: mss = mtu - ip头 - udp = 1500 - 20 - 8 = 1472
        tcp: mss = mtu - ip头 - tcp = 1500 - 20 - 20 = 1460(mms) mss——最大报文大小

      mtu的影响:
        对tcp:tcp在传输层进行数据传输(三次握手)的时候会双方协商mms大小,在传输层自动进行数据分段,
        这个mms也取决于mtu大小,双方会选择较小的一方位传输大小,因此不会进行数据分片
        对udp:udp在传输数据的时候数据不大于64k-ip头- udp头的情况下都可以进行传输,
        但数据大小大于mtu,会在网络层进行数据分片,因此udp数据被分片,如果任意的分片丢失,则会
        造成数据报被丢失,所以分片越多风险越大,最好在应用层将数据段带大小分配合适

      其他重要协议或技术:
        DNS协议:domain name system(域名系统)
        作用:域名解析,通过域名获取到服务器的ip地址
        域名:服务器地址的一种表示方法
        域名解析服务器采用分布式存储
        分布式好处:提高速度/分担压力/提高容灾能力

    域名管理于层级划分:
      根域名服务器:全世界13组
      (可以向下授权:如顶级域名服务器.com商业性/.org公益性/.gov政府/.cn中国/.jp日本/.us/)
      (顶级域名在向下授权:如:二级域名.qq.com/.baidu.com)
      (二级域名在向下授权:如:三级域名.zhidao.baidu.com/.image.baidu.com)

      域名解析流程:
        递归形式:
          1.检测本机的hosts文件是否有对应关系
          2.若没有对应管理,则检测本地dns解析器缓存
          3.若没有,则向本地dns服务器发起求情(8.8.8.8(谷歌DNS服务器地址),本机是自动获取,获取运营商的服务器地址)
          4.若没有,则向根域名服务器发起请求
          5.若没有则依次往下找...最终没有找到则表示解析失败
        问题:在浏览器中输入url回车后,发什么了什么问题?例如:www.baidu.com
          1.dns解析——解析完成返回ip地址
          2.组织http请求信息
          3.建立tcp客户端发送http请求
          4.网络层封装IP协议
          5.链路层eth(以太网)协议

      ICMP协议:
        控制报文协议——网络层协议
          作用:进行网络探测
          命令: ping www.baidu.com
          ping 命令就是由ICMP协议实现的
          ping:通过ICMP协议实现,ICMP是网络层层协议所以并不使用端口

      NAT技术:(地址转换技术)
        目的:在网络层将替换数据的源ip地址成为自己的ip地址
        让数据在复杂的网络中进行传输的时候,怎么去怎么回来
        在本地建立NAPT映射关系,保证收到回复数据,能够确认应该发送给内网的哪一个主机

        NAT是一个服务,通常部署在网关设备上

      代理服务器:VPN(FQ)
        与NAT的区别:
          NAT:工作在网络层,进行地址转换,通常部署在网关设备上
          VPN:工作在应用层,代理服务是个应用,应用层的一个程序,可以部署在任意主机上

posted on 2019-08-15 23:10  The_Ocean  阅读(240)  评论(0编辑  收藏  举报

导航