Linux应用软件编程---网络编程1(目的、网络协议、网络配置、UDP编程流程)

Linux下的网络编程

一、目的

    不同主机,进程间通信。

二、解决的问题

1. 主机与主机之间物理层面必须互联互通。
2. 进程与进程在软件层面必须互联互通。

    物理层面的互联互通流程图如下:

    其中:

        IP地址:计算机的软件地址,用来标识计算机设备
        MAC地址:计算机的硬件地址(固定)
        网络的端口号:标记同一主机上的不同网络进程

        交换机:实现局域网内通信
        路由器:负责数据的路径规划
         广域网:实现远距离传输

三、网络协议

    网络协议是网络通信的标准。

1、OSI 七层模型

    OSI 七层模型:开放系统互联模型(open system interconnect)是不同体系结构设备间,网络通信的通信标准。
    应用层:要传输的数据信息,如文件传输,电子邮件等
    表示层:数据加密、解密操作,压缩,解压缩
    会话层:建立数据传输通道,   --->一个会话
    传输层:传输的方式  UDP  TCP   端口号
    网络层:实现数据路由,路径规划    路由器  ip
    数据链路层:封装成帧,点对点通信(局域网内通信),差错检测   交换机  ARP
    物理层:定义物理设备标准、电气特性,比如网线,光纤等传输介质   比特流  bit  0 1

2、TCP/IP 模型

    TCP/IP 模型分为五层和四层两种。每所表示的与 OSI 七层模型内容一致,只是将七层的 “ 应用层、表示层、会话层 ” 合并之后表示五层和四层的应用层,将五层的 “ 数据链路层、物理层 ” 合并表示四层中的网络接口层。

    五层结构及举例说明:

应用层:

HTTP:超文本传输协议
HTTPS:超文本传输协议(SSL加密算法)
FTP:文件传输协议(TCP)

TFTP:简单文件传输协议(UDP)
MQTT:消息队列遥测传输(物联网协议)
DNS:域名解析服务(www.baidu.com---》IP地址)

 传输层:TCP :传输控制协议
UDP:用户数据报协议
   网络层:IP协议:
           IPv4:
           IPv6:
数据链路层:ARP : 地址解析协议
 物理层:

四、IP 协议

1、概念

  IP 协议位于网络层,有 IPv4 (32位) 和 IPv6 (128位) 两种,以IPv4 为主展开学习。 
  192.168.1.140    (用户表示形式)   点分十进制   
  11000000 10101000 00000000 01000011    (计算机存储形式) 32bits
  在 192.168.0.121/24 中,24表示网络位的位数

2、IPv4 的地址

  IPv4 的 IP地址 = 网络位 + 主机位 
      网络位:该IP地址位于哪个网段(局域网)内
      主机位:这个网段(局域网)第几台主机

3、子网掩码

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

  例如:子网掩码如:255.255.255.0
            11111111.11111111.11111111.00000000

 4、网段号

   规则:IP地址网络位不变,主机位全为0,则为该IP地址的网段号
   例如:IP地址:192.168.1.3
             子网掩码:255.255.0.0
             网段号:192.168.0.0
    网段内的IP能直接通信

5、广播号

    规则:IP地址网络位不变,主机位全为1,则为该IP地址的广播号
    例如:IP地址:192.168.1.3
            子网掩码:255.255.255.0
            广播号:192.168.1.255

      向广播号发送信息,所有局域网内IP都能收到此信息
            feiQ VNC
            192.168.1.255
        网关地址:
            192.168.1.1

6、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
         用来进行实验

7、公有IP 和 私有IP

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

五、网络端口号

1、概念

    端口号:16位的整形数据(unsigned short)0-65535
    端口号功能:标记同一主机上的不同网络进程

2、分类

    1)任何TCP/IP实现所提供的服务都用1-1023之间的端口号。
            http : 80
            FTP: 20/21
            TFPT: 69
            HTTPS: 443
    2)端口号从1024-49151是被注册的端口号,被IANA指定为特殊服务使用。
                MQTT:1883/8883
    3)从49152-65535是动态或私有端口号。

3、数据包的封装和解封过程

六、网络配置

1.  ping  ip地址/域名

    查看当前主机和IP/域名所对应的这台主机网络是否联通
    例如,ping www.baidu.com

2. ifconfig 

    ifconfig 在Linux查看当前主机的IP地址
    ipconfig 在Windows上查看当前主机的IP地址

3. 网络配置

    1)虚拟机-->设置-->网络适配器-->桥接模式
    2)编辑-->虚拟网络编辑器-->更改设置-->VMnet0-->桥接至-->当前PC正在上网的网卡上-->应用-->确定
    3)修改网络配置文件
          输入指令:sudo vim /etc/network/interfaces
          将内容更改为:
             auto lo
             iface lo inet loopback
             auto ens33 
             iface ens33 inet dhcp
    4)重启网络服务
          输入指令:sudo /etc/init.d/networking restart
    5) 测试
           输入指令:ping www.baidu.com

七、网络协议 UDP

    UDP 位于传输层,用户数据报协议(User Datagram Protocol)。

 1、网络编程模型

    1)B/S模型

        browser/server(浏览器/服务器)
        (1)客户端是通用的客户端(浏览器)
        (2)一般只做服务器开发
        (3)客户端要加载的数据均来自服务器

    2)C/S模型

        client/server(客户端/服务端)
         (1)客户端是一个专用的客户端
         (2)服务器和客户端都需开发
         (3)客户端可保存资源,本地加载,无需所有数据都请求服务器

2、UDP编程流程

           套接字:文件描述符
                          网络通信时,应用层可操作的端口。

3、相关函数接口

    1)socket() 函数

 int socket(int domain, int type, int protocol);
功能:创建通信的套接字
参数:
        domain:网络层使用什么协议族
                  AF_INET:IPv4
                  AF_INET6:IPv6
        ype:规定传输层的协议
                  SOCK_DGRAM : UDP协议
                  SOCK_STREAM:TCP协议
                  SOCK_RAW :原始套接字
        protocol:0 按照默认协议方式创建
返回值:
        成功:套接字
        失败:-1

    2)sendto() 函数

 ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                      const struct sockaddr *dest_addr, socklen_t addrlen);

功能:向网络套接字发送数据
参数:
       sockfd:套接字
       buf: 要发送的数据的首地址
       len:要发送的字节数
       flags: 0:按照默认方式发送
       dest_addr:接收方的地址信息(IP+端口号)
       addrlen:接收方地址的大小

返回值:
        成功:实际发送的字节数
        失败:-1

        其中,IPv4 的地址信息存放在 struct sockaddr_in 中:

可使用 “ man 7 ip ” 指令查看程序员手册

           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 */
           };

    3)IP 地址形式转换函数

        (1)inet_addr() 函数
in_addr_t inet_addr(const char *cp);
功能:
      将字符串IP地址转换成二进制IP地址形式
        (2)inet_ntoa() 函数
char *inet_ntoa(struct in_addr in);
功能:
    将二进制ip转换成字符串

    4)bind() 函数

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
功能:绑定自己的IP地址和端口号
参数:
         sockfd:套接字
         addr:需要绑定的地址
         addrlen:地址大小
返回值:
      成功:0
      失败:-1

    5)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:发送方的地址信息
         addrlen:发送发地址的指针
功能:
       成功:实际接收到的字节数
       失败:-1

【END】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值