• 网络基础


    计算机网络协议

     
    OSI 七层协议(open system interconnection)
     
    依据定义来说,越接近硬件的阶层为底层 (layer 1),越接近应用程序的则是高层 (layer 7)。
    不论是接收端还是发送端,每个一阶层只认识对方的同一阶层数据。
     
    物理层
    功能:
    • 为数据端设备提供传送数据的通路
    • 传输数据
    • 定义电压信号,了解传输编码方式;
     
    数据链路层
    分为两层
    • 逻辑链路子层
      • 帧同步
        • 为了使传输中发生差错后只将有错的有限数据进行重发
        • 数据链路层将比特流组合成以帧为单位传送。每个帧要
        • 传送数据外,还包括校验码,以使接受方能发现传输中的差错。
        • 从比特流中区分出帧的起始于终止就是帧同步;
      • 错误控制
      • 流量控制
    • MAC介质访问控制子层
      • 调度
        • 将逻辑信道映射到传输信道
     
    网络层
    “路由选择与逻辑寻址”
    目的是实现两个端系统之间的数据透明传送
    功能
    • 路由选择
      • 静态路由
      • 动态路由
    • 路由及逻辑寻址
     
    传输层
    定义了发送端与接收端的联机技术(TCP,UDP)
    功能:
    • 封包格式
    • 数据封包的传送
    • 流程的控制
    • 传输过程的侦测与复原重新传送
    确保各个资料封包可以正确无误的到达目的端。
     
    会话层
    “对话与交谈”
    功能:
    • 为会话实体建立连接
    • 数据传输阶段
    • 连接释放
     
    表示层
    “通用的数据格式”
    主要作用是为异种通信提供一种公用语言,
    每台计算机可能有它自己的表示数据的内部方法,
    例如,ASCII码与EBCDIC码,所以需要表示层协定来保证不同的计算机可以彼此理解。
    功能:
    • 语法转换
    • 语法协商
    • 连接管理
     
    应用层
    应用层并不属于应用程序所有,而是定义应用程序如何进入此层的沟通接口,以将数据接收或传送给应用程序。
     
    七层协议只是一个参考模型,并没有很多程序会真的使用这七层模型;只是七层模型解释网络传输的情况来说,非常清楚。
    实际联网程序代码,使用TCP/IP协议;
     
    TCP/IP协议
     
    2.2 tcp/ip--链接层

     
     
    tcp/ip最底层的链接层主要与硬件比较有关系。
     
    2.2.2 局域网络使用的设备--以太网络
    但实际使用的只有 1,2,3,6 蕊而已, 其他的则是某些特殊用途的场合才会使用到;即橙白,橙,绿白,绿,四根线使用到了;
     
    mac的封装格式
     
    局域网与跨网段传输
    • 局域网中传输使用mac地址。
    • 其他网段,先是IP寻址,然后ARP地址解析协议,找到对应MAC地址,再传数据; 
    • 只有透过路由器,才将封包送到另一个网域;
     
    MTU 最大传输单位
    • 上面的最大传输量就是1500bytes,这个就是MTU数值;
    • 每种网络接口的MTU都不同,有些为1492MTU,不过在以太网络上,标准定义就是1500bytes。
     
    而IP封包中,最大可以到65535bytes。既然礼物(IP)比盒子(MAC)大,那么怎么放的进去?
    此时IP封包是可以进行拆解的,然后才能放到MAC当中,等数据都传到目的地,再由目的地的主机将他们组装回来。
     
    当然MTU大的话,会减少IP封包次数,提升传输效率;但是不能确保目的地接受媒体支持这种MTU,并且能很好的适配。因此不建议更改标准的MTU值;
     
    2.3 tcp/ip--网络层

     
    网络层最重要的就是IP 与 路由
     
    2.3.1 IP 封包的封装
    ip 封包可以达到65535bytes,在比mac大的情况下,操作系统会对IP进行拆解的动作。
     
    • version(版本)
      • 宣告这个ip封包的版本,目前ipv4
    • IHL(Internet header length,ip表头的长度)
      • 使用的单位是字组(word),一个字组为4bytes
    • type of service(服务类型)
    • total length(总长度)
    • identification (辨别码)
      • 在拆分,合并时,通过这个辨别码来识别,各分拆ip包是否是同一个大ip
    • Flages(特殊旗标)
      • 内容为[0DM]
      • D:0表示可以分段,1表示不可分段
      • M:0表示ip为最后分段,1表示非最后分段;
    • fragment offset(分段偏移)
      • 表示目前这个ip分段在原始的ip封包中所占的位置。像序号;
      • 通过total length,identification,flags,fragment offset 就能将小IP分段在接受端组合起来;
    • Time to live(TTL,存活时间)
      • 表示IP封包的存活时间,范围0--255,。当这个IP封包通过一个路由器时,TTL就会减一,当TTL为0时,就直接丢弃。
    • protocol number(协议代码名)
      • 记载每种数据封包的内容。
      • 相关封包协议代码名
        • icmp,igmp,ggp,ip,tcp,egp,udp
      • 比较常见的就是TCP,UDP,ICMP(internet control message protocol)
    • header checksum(表头检查码)
      • 用做IP表头的错误检验
    • source address
    • destination address
    • options(其他参数)
      • 这个是额外功能,提供包括安全处理机制,路由记录,时间戳,严格与宽松之来源路由等
    • padding(补齐项目)
      • 由于options的内容不一定有多大,但IP每个数据都必须要是32bits,当options不足32时用padding补齐;
     
    重点
    • 分拆合并的4个
      • total length
      • identification,识别数据哪个IP包
      • flags,特殊旗帜,可不可分段,是否为最后分段
      • fragment offset;此封包在原封包的位置
    • 目标地址与原地址
      • destination address ,source address
    • TTL:存活时间,每经过一个路由则减一,为0 则丢弃
    • protocol
      • 是哪种类型数据包
      • icmp,ip,tcp,udp
     
    2.3.2 IP地址的组成与分级
    IP:网络号与主机号
     
    主机号
    • 全0 表示整个网段的地址  --Network
    • 全1 表示广播的地址        --Broadcast
     
    ip地址等级
    Class A : 0.xx.xx.xx---127.xx.xx.xx
    Class B : 128.xx.xx.xx-191.xx.xx.xx
    Class C : 192.xx.xx.xx-223.xx.xx.xx
     
    2.2.3 netmask(子网掩码)
     
    分割IP地址哪些是位是网络段,哪些是主机段;
     
    IP地址每一位与子网掩码每一位做与 得出的非0的即是网络段,为0的就是主机段;
     
    子网掩码作用:举例
    • netmask:255.255.255.0 
    • IP:192.168.1.1
      • 1与任何数做与;得任何数
      •  0月任何数做与;得0
      • 此时 255.255.255.0 与 192.168.1.1 做与
      • 得 192.168.1.0 则网络号段192.168.1  主机号段是0;
     
     
    子网切分举例
    • 原本的 C Class 的 Net_ID 与 Host_ID 的分别
      • 11000000.10101000.00000000.00000000 Network: 192.168.0.0
      • 11000000.10101000.00000000.11111111 Broadcast: 192.168.0.255
      • |----------Net_ID---------------|---host--|
    • 切成两个子网之后的 Net_ID 与 Host_ID 为何?
    • 11000000.10101000.00000000.0 0000000 多了一个 Net_ID 了, 为 0 (第一个子网)
    • 11000000.10101000.00000000.1 0000000 多了一个 Net_ID 了, 为 1 (第二个子网)
    • |----------Net_ID--------------|----host---|
    • 第一个子网
    • Network:    11000000.10101000.00000000.0 0000000 192.168.0.0
    • Broadcast: 11000000.10101000.00000000.0 1111111 192.168.0.127
    • Netmask:   11111111.11111111.11111111.1 0000000 255.255.255.128
    • 第二个子网
    • Network:   11000000.10101000.00000000.1 0000000 192.168.0.128
    • Broadcast: 11000000.10101000.00000000.1 1111111 192.168.0.255
    • Netmask:  11111111.11111111.11111111.1 0000000 255.255.255.128
    依靠netmask来做子网切分;
    计算子网的快捷方式
    其实子网的计算是有偷吃步的,我们知道 IP 是二进制,每个位就是 2 的次方。又由于 IP 数量都是平均分配到每个子网去, 所以,如果我们以 192.168.0.0 ~ 192.168.0.255 这个网段来说,要是给予 Net_ID 是 26 位时,总共分为几段呢? 因为 26-24=2 ,所以总共享掉两个位,因此有 2 的 2 次方,得到 4 个网段。再将 256 个 IP 平均分配到 4 个网段去, 那我们就可以知道这四个网段分别是:
    · 192.168.0.0~192.168.0.63
    · 192.168.0.64~192.168.0.127
    · 192.168.0.128~192.168.0.191
    · 192.168.0.192~192.168.0.255
     
    实际上就要有Network以及Netmask就能表示一个网域,因为Broadcast能推算出来即主机号全1;
     
    所以有了新的写法:
     
    Network/Netmask
    192.168.0.0/255.255.255.0
    192.168.0.0/24 <==因为 Net_ID 共有 24 个 bits
     
     
    2.3.5路由的概念
    每一个主机都会维护一个路由表,会根据路由表中地址,根据IP包的目标地址选择路由器,然后发送到路由器,就不管了;
    至于在同一网段的,不用发送到路由器,则是按照下层链接层的ARP,地址解析将IP地址解析成MAC地址,然后按照MAC地址发送出去;
     
    观察路由情况
    route
     
    2.3.6 IP与MAC:链结层ARP与RARP协定;
     
    以太网络主要使用网卡卡号(MAC地址),来传输数据的;
     
    ARP(Address resolution protocol,网络地址解析)协议
    RARP(Revers ARP,反向网络地址解析)协议
     
    当想知道某个IP与哪张网卡绑定时,我们主机会向整个局域网发出ARP封包,对方收到ARP封包后就会回传他的MAC地址给我们;
    我们的主机就知道了这个IP的对应MAC地址,接下来就是传输数据啦。
     
    为了避免每次传输数据,都要ARP,因此,当使用ARP协议取得目标IP的mac地址后,我们将这对应关系记录到ARP table中(内存内的数据)记录20分钟;
     
    使用arp指令驱动 ARP表格内的IP/MAC对应数据。
    [root@www ~]# arp -[snd] 
    选项与参数:
    -n :将主机名以 IP 的型态显示
    -d :将 hostname 的 hardware_address 由 ARP table 当中删除掉
    -s :设定某个 IP 或 hostname 的 MAC 到 ARP table 当中
    范例一:列出目前主机上面记载的 IP/MAC 对应的 ARP 表格
    [root@www ~]# arp -n
    Address HWtype HWaddress Flags Mask Iface
    192.168.1.100 ether 00:01:03:01:02:03 C eth0
    192.168.1.240 ether 00:01:03:01:DE:0A C eth0
    192.168.1.254 ether 00:01:03:55:74:AB C eth0
    范例二:将 192.168.1.100 那部主机的网卡卡号直接写入 ARP 表格中
    [root@www ~]# arp -s 192.168.1.100 01:00:2D:23:A1:0E
    # 这个指令的目的在建立静态 ARP
    2.3.8  ICMP协议
    Internet control message protocol ,因特网信息控制协议。
    icmp
    • 错误侦测与回报的机制
    • 确保网络联机状态与联机正确性
    • 网络层重要的封包之一
    • 不是独立的而是纳入到IP的封包中,也就是说ICMP同样是透过IP封包进行数据传输的。
    • ---ip封包中protocol number 字段会告知是TCP,UDP,ICMP还是其他什么数据;
    在Internet上有传送能力的就是IP封包;
     
    ICMP有相当多的类别可以侦测与回报,常见的ICMP的类别(type)
     
    如何利用ICMP检验网络的状态
    ping与traceroute;可以透过ICMP封装包的辅助来确认与回报网络主机的状态。
    在设定防火墙的时候,ICMP封包不应该全部当掉;
     
    2.4 TCP/IP--传输层封包与数据 

     
            网络层的IP封包只负责把数据送到正确的目标主机去,至于封包到底有没有成功正确被接受,那就不是网络层IP协议的事情,而是传输层的事情了。
     
    2.4.1  TCP协议
         传输层TCP封包数据必须要能够放到IP的数据袋中才行。如图所示:
     
    TCP封包表头资料:
     
    • source port
      • 来源端口号(如mysql 默认3306端口)
    • destination port
      • 目标端口号(如mysql 默认3306端口)
    • sequence number (封包序号)
      • 记录每个封包的序号,可以让接受端重新将TCP数据组合起来
      • 类似IP封包中的identification(辨别码),flags,fragment offset
      • 因为TCP封包必须要带入IP封包中,所以当TCP数据太大(大于IP封包的容许程度),就得进行分段;
    • acknowledge number(回应序号)
      • 当主机给client端的回应
      • client端收到这个确认码时,就确定之前传递的封包已经被正确手下。
    • data offset(资料补偿)
      • 上图中有个options字段,长度是非固定的,是确认整个TCP封包的大小,就需要这个标志来说明整个封包区段的起始位置。
    • reserved(保留)
      • 未使用的保留字段
    • code(control flag ,控制标志码)
      • 说明联机状态的句柄,好让接收端了解这个封包的主要动作
      • 6个字段,代表6个句柄
        • urg(urgent): 若为 1 则代表该封包为紧急封包, 接收端应该要紧急处理,且图 2.4-1 当中的 Urgent Pointer 字段也会被启用
        • ACK(Acknowledge):若为 1 代表这个封包为响应封包, 则与上面提到的 Acknowledge Number 有关
        • PSH(Push function):若为 1 时,代表要求对方立即传送缓冲区内的其他对应封包,而无须等待缓冲区满了才送
        • RST(Reset):如果 RST 为 1 的时候,表示联机会被马上结束,而无需等待终止确认手续。这也就是说, 这是个强制结束的联机,且发送端已断线
        • SYN(Synchronous):若为 1,表示发送端希望双方建立同步处理, 也就是要求建立联机。通常带有 SYN 标志的封包表示『主动』要连接到对方的意思
        • FIN(Finish):若为 1 ,表示传送结束,所以通知对方数据传毕, 是否同意断线,只是发送者还在等待对方的响应而已。
    • window(滑动窗口)
      • 主要是用来控制封包的流量的,可以告知对方目前本身有的缓冲器容量(receive buffer)还可以接收包。当window=0时,代表缓冲器已经额满,所以应该要暂停传输数据。
    • checksum(确认查验码)
      • 数据发送前会进行一个校验动作,并将该校验值填入次字段
      • 接收端,在接收完数据后,也会对数据校验,然后比较两次校验值是否相等。
    • urgent pointer(紧急资料)
      • 在code字段内urg=1时才会产生作用。可以告知紧急数据所在的位置
    • options(任意资料)
      • 目前此字段仅应用于表示接收端可以接收的最大数据区段容量,若此字段不使用,表示可以使用任意数据区段的大小。这个字段较少使用。
    • Padding(补足字段)
      • 如同 IP 封包需要有固定的 32bits 表头一样, Options 由于字段为非固定,所以也需要 Padding 字段来加以补齐才行。同样也是 32 bits 的整数。
     
    通讯端口
    在上面TCP表头中,最重要的就是source port ,destination port。因为是16位的,所以最大端口可达65535(2的16次方)!
     
    网络是双向的,服务器与客户端要达成联机的话, 两边应该要有一个对应的端口来达成联机信道,好让数据可以透过这个信道来进行沟通。
     
    如果IP 是网络世界的门牌号,那么这个端口号就是门牌号上建筑物的楼层。
    所以, IP 是门牌, TCP 是楼层,真正提供服务的, 是在该楼层的那个人 (程序)!
     
    特权端口
    Internet中规定了一些固定port,在Linux中/etc/services
    值的注意的是小于1024的端口要启动时,必须是root才行。用root启动的端口叫做特权端口。
     
    2.4.2 TCP 的三次握手
     
    发送端请求,SYN=1,封包序号=10001,接收端回过来的ACK=1,回应序号=10002;

    回应序号比封包序号大1;

     
    • A:封包发起
      • 客户端必须随机取用一个大于 1024 以上的端口口来做为程序沟通的接口。
      • 然后在TCP 的表头当中,必须要带有 SYN 的主动联机(SYN=1),并且记下发送出联机封包给服务器端的序号 (Sequence number = 10001) 。
    • B:封包接收与确认封包传送
      • 当服务器接到这个封包,并且确定要接收这个封包后,就会开始制作一个同时带有 SYN=1, ACK=1 的封包, 其中那个 acknowledge 的号码是要给 client 端确认用的,所以该数字会比(A 步骤)里面的 Sequence 号码多一号 (acknowledge = 10001+1= 10002),
      • 那我们服务器也必须要确认客户端确实可以接收我们的封包才行,所以也会发送出一个 Sequence (seq=20001) 给客户端,并且开始等待客户端给我们服务器端的回应喔!
    • C:回送确认封包
      • 当客户端收到来自服务器端的 ACK 数字后 (10002) 就能够确认之前那个要求封包被正确的收受了,
      • 接下来如果客户端也同意与服务器端建立联机时,就会再次的发送一个确认封包 (ACK=1) 给服务器,亦即是 acknowledge = 20001+1 =20002
    • D:取得最后确认
      • 若一切都顺利,在服务器端收到带有 ACK=1 且 ack=20002 序号的封包后,就能够建立起这次的联机了
     
    牢记一个事实就是[网络是双向的], 所以不论是服务器端还是客户端,都必须要透过一次 SYN 与 ACK 来建立联机,所以总共会进行三次的交谈;
     
    实际演示:
    1. 鸟哥说:   A 同学你在不在?
    2. A 同学说:我在!那鸟哥你在不在?
    3. 鸟哥说:    我也在
    此时两个人就确认彼此都可以听到对方在讲啥,这就是可靠联机啦!
     
    2.4.3 非连接导向的UDP协议
     
    UDP 的全名是:『 User Datagram Protocol, 用户数据流协议』, UDP 与 TCP 不一样, UDP 不提供可靠的传输模式,
    因为他不是面向连接的一个机制,这是因为在 UDP的传送过程中,接受端在接受到封包之后,不会回复响应封包 (ACK) 给发送端,
    所以封包并没有像 TCP 封包有较为严密的检查机制。
     
         UDP表头资料:
     
    TCP
    • 传输可靠
    • 速度慢
    UPD
    • 由于表头数据较少,因此可以存更多data
    • 适合实时反应的一些数据流,例如影像
    • 不需要考虑联机要求,联机终止,流量控制等特性。
    • 数据正确性不保证
     
    其实很多软件同时提供TCP/UDP两种传输协议。如DNS服务。
     
  • 相关阅读:
    14-6 XShell连接远程服务器
    14-5 XManager工具安装
    14-4 本地私有化部署方案介绍
    14-3 阿里云域名购买及备案流程
    14-2 阿里云ECS服务器购买介绍
    13-7 Docker基本使用总结
    初识Redux-Saga
    React Native填坑之旅 -- FlatList
    React Native填坑之旅 -- 使用react-navigation代替Navigator
    React Native填坑之旅 -- 回归小插曲
  • 原文地址:https://www.cnblogs.com/Aiapple/p/5951937.html
Copyright © 2020-2023  润新知