网络体系结构及通信协议(UDP)


进程间通信  interprocess communicate  ------>IPC
    三大类:

同一台主机之间的进程
1、古老的通信方式
        无名管道  
        有名管道  
        信号

2、IPC对象通信 system v   
        消息队列
        共享内存
        信号量集 
        
不同主机间进程通信        
3、socket通信
        网络通信

    
1.国际网络体系结构:
    OSI模型: open system interconnect           理论模型
    1977   国际标准化组织
    各种不同体系结构的计算机能在世界范围内互联成网。
    
    
    
    协议簇
    TCP/IP模型:  工业模型
    4层
    应用层:HTTP、HTTPS、FTP、TFTP、MQTT
    传输层:TCP、UDP
    网络层:IP
    网络接口层:网络接口层既是传输数据的物理媒介,也可以为网络层提供一条准确无误的线路
    
    5层
    应用层:HTTP、HTTPS、FTP、TFTP、MQTT
    传输层:TCP、UDP
    网络层:IP
    数据链路层:封装成帧,点对点通信(局域网内通信),差错检测   交换机
    物理层:定义物理设备标准,比如网线,光纤等传输介质   比特流  bit


2.协议:
    应用层协议:
        FTP:文件传输协议(实现文件上传/下载)
        TFTP:简单文件传输协议(实现文件上传/下载)
        HTTP:超文本传输协议(实现超文本(集视频、图片、文字于一体的文件类型)传输)
        HTTPS:加密版超文本传输协议
        MQTT:消息队列遥测传输协议(物联网传输)
        
    
    传输层协议:
        UDP:用户数据报协议
        TCP:传输控制协议

    网络层:
        IP协议
        192.168.1.128
        IPv4    32位
        IPv6    128位
        
        192.168.1.3         (用户表示形式)   点分十进制   
        11000000101010000000000100000011    (计算机存储形式) 32bits
        
        IP地址 = 网络位 + 主机位 
        
        192.168.0.121/24
        24:网络位的位数
        
        网络位:该IP地址位于哪个网段(局域网)内
        主机位:这个网段(局域网)第几台主机

        子网掩码:
            如:255.255.255.0
            11111111.11111111.11111111.00000000
            用来区分IP地址的网络位和主机位,搭配IP地址使用。
            子网掩码是1的部分对应IP地址的网络位
            子网掩码是0的部分对应IP地址的主机位

        192.168.1.0
        网段号:
            IP地址网络位不变,主机位全为0,则为该IP地址的网段号
            192.168.1.3
            255.255.0.0
            192.168.0.0
            位于
            192.168.1.0 网段内(网段内的IP能直接通信)
            
        广播号:
            IP地址网络位不变,主机位全为1,则为该IP地址的广播号
            192.168.1.255
            255.255.255.0
            广播号:
            192.168.1.255(向广播号发送信息,所有局域网内IP都能收到此信息)
            
            feiQ VNC
            192.168.1.255
        
    IP地址的划分:
        (1)A类地址:
                范围:1.0.0.0 - 126.255.255.255
                子网掩码:255.0.0.0          126*2^24        
                用于管理大规模网络
                
                私有IP地址:10.0.0.0 - 10.255.255.255
            
                127.0.0.0   回环地址
        (2)B类地址:
                范围:128.0.0.0 - 191.255.255.255
                子网掩码:255.255.0.0         2^16
                管理大中规模网络
                
                私有IP地址:172.16.0.0 - 172.31.255.255
            
        (3)C类地址:
                范围:192.0.0.0 - 223.255.255.255
                子网掩码:255.255.255.0        2^8
                管理中小规模网络
                
                私有IP地址:192.168.0.0 - 192.168.255.255
                
        (4)D类地址:
                224.0.0.0 - 239.255.255.255
                组播和广播使用
                
        (5)E类地址:
                240.0.0.0 - 255.255.255.254
                用来进行实验

        公有IP:由电信公司直接分配,并需要付费的IP地址, 可以直接访问internet
        私有IP:不能直接访问internet的ip地址
                
        节省ip地址


端口号: 16位的数值 0-65535
    作用:唯一的标识一个进程
    每一个应用进程都有一个端口号;
    通讯时用来区分数据包属于哪一个进程。
    
    分类:
        1)任何TCP/IP实现所提供的服务都用1-1023之间的端口号。
            http : 80
            FTP: 20/21
            TFPT: 69
            HTTPS: 443
        2)端口号从1024-49151是被注册的端口号,被IANA指定为特殊服务使用。
        
        3)从49152-65535是动态或私有端口号。


IP+PORT : 可以找到目标主机上的目标进程

3.TCP/IP封包,拆包过程
    网络协议栈

===============================================================================================


1.网络的配置:
    如果需要拨号上网的,后序网络调试建议使用手机热点。
    1.ping
      ping IP地址/域名
      测试当前主机与IP地址/域名是否连通
      
      PING www.a.shifen.com (14.215.177.39) 56(84) bytes of data.
      64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=1 ttl=55 time=38.5 ms
      64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=2 ttl=55 time=42.6 ms

      www.baidu.com -> DNS服务器 -> IP地址 
        
    2.ifconfig
      查看当前操作系统中网卡信息
      
      ens33:虚拟机中的网卡
      lo:回环地址(127.0.0.1)
      inet:IPv4地址
      netmask:子网掩码
      broadcast:广播号
      inet6:IPv6地址
      ether:MAC地址 
      


    4.永久配置IP地址:
        1.将虚拟机设置为桥接模式:
            点击"虚拟机"
            点击"设置"
            点击"网络适配器"
            点击"桥接模式"
            点击"确定"
            
        2.将虚拟机的IP地址桥接到无线网卡上
            点击"编辑"
            点击"虚拟网络编辑器"
            点击"更改设置"
            点击"桥接到"能上网的网卡上去
            点击"应用"
            点击"确定"
        
        3.设置虚拟机的IP地址
            1.打开虚拟机网卡配置文件
                sudo vi /etc/network/interfaces 

            2.将文件内容修改为如下:
                自动获取IP地址配置如下:(推荐)
                
                auto lo
                iface lo inet loopback
 
                auto ens33
                iface ens33 inet dhcp 
                                                                                            
            
            3.重启网络服务
                sudo /etc/init.d/networking restart 

==========================================================================================
 
网络编程之 UDP
 
UDP:用户数据报协议
User Datagram Protocol

1、特性:         
                1.发送数据时不需要建立链接,节省资源开销
                2.不安全不可靠的协议        //一般用在实时性比较高的广播,组播//vnc
                3.面向报文。
                4.资源开销小

                
2、框架:

    C/S模式  :有一个专用的客户端  client----server
    QQ1--->腾讯服务器---->QQ2

   server:socket() ===>bind()===>recvfrom()===>close()
   client:socket() ===>(bind())===>sendto() ===>close()
 
    B/S模式    :有一个通用的客户端浏览器
    browser----server
    
套接字编程接口:
    

    1.socket 
      套接字:通信对象的抽象, 网络通信的端口,一个通信链的句柄。
      
      int socket(int domain, int type, int protocol);
      功能:
        创建一个用来通信的接口(文件描述符)
      参数:
        domain:通信的协议族(AF_INET:IPv4协议族)
        type:
            SOCK_DGRAM:数据报套接字    (UDP使用此类型)
            SOCK_STEAM:流式套接字    (TCP使用此类型)
            SOCK_RAW:原始套接字
        protocol:
            默认传0 按照协议的默认属性创建
      返回值:
        成功返回用来进行通信的文件描述符
        失败返回-1 
        
    IPv4地址形式:
        struct sockaddr_in {
           sa_family_t    sin_family; /* address family: AF_INET */
           in_port_t      sin_port;   /* port in network byte order */
           struct in_addr sin_addr;   /* internet address */
       };

       /* Internet address. */
       struct in_addr {
           uint32_t       s_addr;     /* address in network byte order */
       };
        
    2.sendto 
      ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                      const struct sockaddr *dest_addr, socklen_t addrlen);
      功能:
        向一个IP地址和端口发送数据信息
        端口号:区分一台主机不同的应用程序(0 - 65535)
      参数:
        sockfd:套接字文件描述符
        buf:发送数据空间首地址
        len:发送数据的长度
        flags:发送数据属性(默认为0)
        dest_addr:目的IP地址和端口
        addrlen:目的IP地址和端口的长度
      返回值:
        成功返回实际发送字节数
        失败返回-1 

    
        struct sockaddr             通用地址类型
        struct sockaddr_in             IPv4地址类型
        struct sockaddr_in {
           sa_family_t    sin_family; /* address family: AF_INET */
           in_port_t      sin_port;   /* port in network byte order */
           struct in_addr sin_addr;   /* internet address */
        };
        struct in_addr {
           uint32_t       s_addr;     /* address in network byte order */
        };


    3.htons----》主机转网络字节序
        
        主机:小端   host
        网络:大端   network
    
      uint32_t htonl(uint32_t hostlong);          主机转网络
      uint16_t htons(uint16_t hostshort);         主机转网络
      uint32_t ntohl(uint32_t netlong);           网络转主机
      uint16_t ntohs(uint16_t netshort);          网络转主机

      h:host
      n:net 
      l:long 
      s:short 

    4.inet_addr
      in_addr_t inet_addr(const char *cp);
      功能:
        将字符串IP地址转换成二进制IP地址形式

      char *inet_ntoa(struct in_addr in);
      功能:
        将二进制ip转换成字符串

    练习:
        循环从终端接收字符串,并发送给串口调试助手,


    5.bind
      int bind(int sockfd, const struct sockaddr *addr,
                socklen_t addrlen);
      功能:将一个套接字与IP地址和端口号绑定(只能绑定自己的IP地址)
      参数:
            sockfd:套接字文件描述符 
            addr:IP地址和端口号结构体首地址
            addrlen:长度
      返回值:
            成功返回0
            失败返回-1 


    6.recvfrom
      ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                        struct sockaddr *src_addr, socklen_t *addrlen);
      功能:
        接收网络发送的数据信息
      参数:
        sockfd:套接字文件描述符
        buf:存放数据空间首地址
        len:最大能够接收的数据个数
        flags:属性默认为0
        src_addr:存放发送端IP地址信息的空间首地址
        addrlen:想要接收的数据长度的空间首地址
      返回值:
        成功返回实际接收字节数
        失败返回-1 

      具有阻塞功能(直到接收到数据,才会继续向下执行)

=========================================================================

  
===============================================================================

wireshark抓包工具的使用:

1. 在线安装wireshark抓包工具
   sudo apt-get install wireshark
   sudo wireshark    //启动wireshark
   
2. wireshark作用:
    可以抓取通过网卡的数据包
    用于软件代码出错调试和错误分子
    
3.使用方法:
    1. sudo wireshark
    2. 选择网卡  双击any网卡
    3. 选择过滤条件
        tcp.port == 80 || udp.port == 80
    4. 进行一次网络通信
================================================

UDP 报文头
    UDP首部有8个字节,由4个字段构成,每个字段都是两个字节:
    
    +------------------------------+
    | 16位源端口   |  16位目的端口  |
    |------------------------------|
    | 16位数据长度 |  16位校验和    |
    |------------------------------|
    |         数据                 |
    +------------------------------+
    
    
    1.源端口: 源主机的应用程序使用的端口号。

    2.目的端口:目的主机的应用程序使用的端口号。

    3.长度:是指UDP头部和UDP数据的字节长度。因为UDP头 部长度为8字节,所以该字段的最小值为8。

    4.校验和:检测UDP数据报在传输中是否有错,有错则丢弃。


 

  • 18
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值