linux——网络编程(1)ositcp

网络编程 
    open system interconnect
1、OSI 模型  ===》开放系统互联模型  ==》分为7层:
    理想模型  ==》尚未实现
        tftp 
        b  /etc/passwd 
        a /etc/123
        应用层  
        表示层  加密解密  gzip
        会话层  网络断开,连接状态,keep-close keep-alive

        传输层tcp  udp  协议  文件    视频,音频
        网路层ip   NAT

        链路层  交换机  数据的格式化  帧 校验
        物理层         100Mb/8  Gbits   100MB 同轴电缆 10Gb    2.4G 5G

  TCP/IP模型  ==》网际互联模型   ==》分为4层:
      实用模型  ===》工业标准
      tcp/ip协议栈
        应用层   ====》应用程序
        传输层   ====》端口号tcp udp
        网络层   ====》IP 地址
        接口层   ====》网卡 驱动  1GB
pcap ,,,
2、TCP/IP协议族:
    www.taobao.com ---> 192.168.0.19
    www.voa.com vpn  
    dns 域名解析

每个地方有一到两个dns服务器

将网站字符串转化成ip地址。


    DHCP

       DHCP是一个局域网的网络协议,使用UDP协议工作,主要应用于大型局域网络环境中,能够为网络内的终端快速自动分配IP地址,帮助网络管理人员将IP地址和其他IP信息分配给网络中不同终端。DHCP还可以为设备配置正确的子网掩码、默认网关和DNS服务器信息。
    

    应用层: HTTP TFTP FTP SNMP DNS ...
    传输层: TCP  UDP   56k猫
    网络层: IP  ICMP(ping) RIP OSPF IGMP ...
    物理层: ARP  RARP  ...   ip--->mac  
    arp,,,,
    192.160.
TCP/IP协议族与DNS处理
在TCP/IP协议族中,DNS(域名系统)是一个关键部分,它负责将人类可读的域名(如www.taobao.com)转换为机器可读的IP地址(如实际分配给淘宝服务器的公网IP地址)。每个地方(如城市、地区或数据中心)可能有一个或多个DNS服务器来处理这些请求。
 

DHCP
DHCP(动态主机配置协议)是一个用于自动分配IP地址和其他网络配置参数的协议。它使用UDP协议在局域网内工作,帮助网络管理员简化网络配置过程。DHCP不仅可以分配IP地址,还可以配置子网掩码、默认网关和DNS服务器等信息。

协议层次

应用层:包括HTTP(用于网页传输)、TFTP(简单文件传输协议)、FTP(文件传输协议)、SNMP(简单网络管理协议)、DNS(域名系统)等。
传输层TCP(传输控制协议)和UDP(用户数据报协议)工作在这一层,提供可靠的端到端通信(TCP)或不可靠的数据报服务(UDP)。提到的“56k猫”通常指的是56kbps的调制解调器,这是早期的互联网接入技术,与TCP/IP协议层无直接关联。
网络层:IP(互联网协议)是这一层的核心,负责数据包的路由和转发。ICMP(Internet控制消息协议,常用于ping操作)、RIP(路由信息协议)、OSPF(开放最短路径优先)、IGMP(Internet组管理协议)等协议也在此层工作。
物理层:虽然ARP(地址解析协议)和RARP(反向地址解析协议)在逻辑上属于网络层,但它们的工作更接近于物理层,因为它们涉及IP地址与MAC地址之间的转换。ARP用于将IP地址解析为MAC地址,而RARP(现已很少使用)用于相反的操作。

URL信息

**http://www.taobao.com**:这是淘宝网的官方网址,通过DNS解析,用户可以访问到淘宝的服务器。但直接映射到`192.168.0.19`是不准确的,因为这是一个私有IP地址范围,通常用于局域网内部。
**http://www.voa.com**:根据文档2,这个URL被标记为无效。可能该域名不存在、已被注销或暂时无法访问。

TCP编程基础知识:

    
1、网络基础 ===》A B C D E 类

010 3333344444


IP地址 == 网络位 + 主机位

IP地址的分类: 点分十进制   ipv4  712934
    A类:    超大规模性网络
                    8    8    8    8
        1.0.0.0 - 126.255.255.255  126.1.1.1 (IP地址的范围)
                                    126.1.1.2
        255.0.0.0    (掩码)
        私有:
        10.0.0.0 - 10.255.255.255
        127.0.0.1
    B类:    大中规模型网络
        128.0.0.0 - 191.255.255.255(范围)
        128.2.1.2  128.2.7.2
        255.255.0.0(掩码)
        私有:
        172.16.0.0 - 172.31.255.255

    C类:    中小规模型网络
        192.0.0.0 - 223.255.255.255(范围)
        255.255.255.0(掩码)
        私有:
        192.168.0.0 - 192.168.255.255
        静态路由
        192.168.0.0  后两位都是0(表示整个网络)
        192.168.0.1  网关(最后一位相当于gate)
        192.168.0.255  (广播)一个人发所有局域网的人都想接到,就发送到255)

    D类:    组播和广播
        224.0.0.0 - 239.255.255.255(组播)
        192.168.0.255 ==  255.255.255.255(4个255,局域网中的所有人)
        235.1.2.3
        192.168.1.0 
        192.168.0.1   网关
        192.168.1.255 广播 

    E类:    实验
        240.0.0.0 - 255.255.255.255
 

网络配置文件与命令

C 类网络:
       ip地址的前三组是网络地址,第四组是主机地址。
    二进制的最高位必须是: 110xxxxx开头
    十进制表示范围: 192.0.0.0 -223.255.255.255
    默认网络掩码:   255.255.255.0
    网络个数: 2^24 个 约 209 万个
    主机个数: 2^8  个 254 个+2 ===》1 是网关 1是广播
    私有地址: 192.168.x.x 局域网地址。
  
  sudo vim  /etc/network/interfaces  ——网络配置命令

这条命令使用sudo以超级用户权限运行vim文本编辑器,打开/etc/network/interfaces文件。这个文件包含了Linux系统的网络接口配置信息。在文件中,你可以定义或修改网络接口(如以太网、Wi-Fi等)的配置,如IP地址、子网掩码、网关等。写一个DHCP进去。

  sudo /etc/init.d/networking restart      
这条命令也是以超级用户权限执行,用于重启网络服务。通过重启网络服务,应用/etc/network/interfaces文件中对网络接口所做的任何更改。这个命令可能会因Linux发行版的不同而有所差异,例如在基于systemd的系统中,可能会使用sudo systemctl restart networkingsudo systemctl restart NetworkManager(如果系统使用NetworkManager)。

  sudo reboot

最后,这条命令以超级用户权限执行系统重启。重启后,新的网络接口配置将生效
    192.168.0.0
    192.168.0.1  route 
    192.168.0.255 boardcast
    801.n.g 


 一、   单机上网的配置:
    1、有网络接口并插入网线。
    2、有ip地址
    3、配置网络设置
            ip: ifconfig ethX X.X.X.X/24 up  

                  ifconfig ens33 192.168.0.13/24 up  255.255.255.0 (临时性修改ip地址)
            网关: route add default gw x.x.x.x 
            DNS:  vi /etc/resolv.conf  ==>nameserver 8.8.8.8
            测试:ping www.baidu.com   测试与其他主机的通讯功能
            
            netstat  -anp 查看网络状态:

在Unix、Linux系统中常用的命令,用于显示网络连接、路由表、接口统计信息、伪装连接和多播成员资格等信息。

二、网络接口
    1、socket  套接字 ==》BSD socket ==》用于网络通信的一组接口函数。

类似于文件标识符,跟网络设备相关联的。

socket api (application interface API 函数)

是一组函数或方法,用于在应用程序之间(包括跨网络)进行通信。


    2、ip+port 地址+端口

===》地址用来识别主机
          端口用来识别应用程序

          port分为TCP port / UDP port  范围都是: 1-65535
          约定1000 以内的端口为系统使用。
            http 80   www.baidu.com
                3306
                telnet 21 
                ssh 22

3、网络字节序 ===》大端存储
        12 00   小端   0x12345678
        00 12
        192.168.0.12
        12.0.168.192
        
        00 12
    数字转换函数:

 #include <arpa/inet.h>
    1236234687
    主机转网络:(大小端转化)

uint32_t htonl(uint32_t hostlong);
    ipv4 192.168.0.1 1~65535
                uint16_t htons(uint16_t hostshort);
    网络转主机:host to net 
                net to host 
                uint32_t ntohl(uint32_t netlong);
                uint16_t ntohs(uint16_t netshort);
                
    字符串转换函数:
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>

    主机转网络:in_addr_t inet_addr(const char *cp);
    inet_addr("192.168.1.20");
    cli.sin_addr
    网络转主机:char *inet_ntoa(struct in_addr in);

client, server 
browser
b/s  http   
p2p   peer 

  1. 由于网络协议通常指定了特定的字节序(如网络字节序,它实际上是大端序),因此发送方和接收方必须遵循相同的规则来处理数据。
  2. 如果发送方和接收方的字节序不同,就需要在发送前将数据转换为网络字节序,并在接收后进行相应的转换。

三、客户端与服务端收发交互

1、模式  C/S 模式  ==》服务器/客户端模型

server:socket()-->bind()--->listen()-->accept()-->recv()-->close()
client:socket()-->connect()-->send()-->close();
int on = 1;
setsockopt(listfd, SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));

服务器端:

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>

int socket(int domain, int type, int protocol);
功能:程序向内核提出创建一个基于内存的套接字描述符

参数:domain  地址族,PF_INET == AF_INET ==>互联网程序
                      PF_UNIX == AF_UNIX ==>单机程序
      type    套接字类型:
                SOCK_STREAM  流式套接字 ===》TCP   
              SOCK_DGRAM   用户数据报套接字===>UDP
              SOCK_RAW     原始套接字  ===》IP
      protocol 协议 ==》0 表示自动适应应用层协议。

返回值:成功 返回申请的套接字id
        失败  -1;

2、int bind(int sockfd, struct sockaddr *my_addr, 
             socklen_t addrlen);

功能:如果该函数在服务器端调用,则表示将参数1相关
      的文件描述符文件与参数2 指定的接口地址关联,
      用于从该接口接受数据。

      如果该函数在客户端调用,则表示要将数据从
      参数1所在的描述符中取出并从参数2所在的接口
      设备上发送出去。

      注意:如果是客户端,则该函数可以省略,由默认
            接口发送数据。
参数:sockfd 之前通过socket函数创建的文件描述符,套接字id
      my_addr 是物理接口的结构体指针。表示该接口的信息。

      struct sockaddr      通用地址结构
      {
          u_short sa_family;  地址族
          char sa_data[14];   地址信息
      };

      转换成网络地址结构如下:
      struct _sockaddr_in    ///网络地址结构
      {
          u_short           sin_family; 地址族
          u_short           sin_port;   ///地址端口
          struct in_addr  sin_addr;   ///地址IP
          char               sin_zero[8]; 占位
      };

      struct in_addr
      {
          in_addr_t s_addr;
      }

      socklen_t addrlen: 参数2 的长度。
返回值:成功 0
        失败  -1;

3、  int listen(int sockfd, int backlog);
    功能:在参数1所在的套接字id上监听等待链接。
    参数:sockfd  套接字id
          backlog 允许链接的个数。
    返回值:成功  0
            失败  -1;


4、int accept(int sockfd, struct sockaddr *addr, 
                socklen_t *addrlen);

   功能:从已经监听到的队列中取出有效的客户端链接并
            接入到当前程序。
   参数:sockfd 套接字id
            addr  如果该值为NULL ,表示不论客户端是谁都接入。
                如果要获取客户端信息,则事先定义变量
               并传入变量地址,函数执行完毕将会将客户端
               信息存储到该变量中。
         addrlen: 参数2的长度,如果参数2为NULL,则该值
                     也为NULL;
                 如果参数不是NULL,&len;
                  一定要写成len = sizeof(struct sockaddr);
   返回值:成功 返回一个用于通信的新套接字id;
                从该代码之后所有通信都基于该id

           失败  -1;

5、接受函数:/发送函数:
    

    read()/write ()   ///通用文件读写,可以操作套接字。
    recv(,0) /send(,0)      ///TCP 常用套机字读写
    recvfrom()/sendto() ///UDP 常用套接字读写


ssize_t recv(int sockfd, void *buf, size_t len,
             int flags);
功能:从指定的sockfd套接字中以flags方式获取长度
      为len字节的数据到指定的buff内存中。
参数:sockfd  
        如果服务器则是accept的返回值的新fd
        如果客户端则是socket的返回值旧fd
      buff 用来存储数据的本地内存,一般是数组或者
      动态内存。
      len 要获取的数据长度
      flags 获取数据的方式,0 表示阻塞接受。

返回值:成功 表示接受的数据长度,一般小于等于len
        失败  -1;


6、close()  ===>关闭指定的套接字id;

相关推荐

  1. Linux编程4.1 网络编程-前导

    2024-07-09 19:50:03       43 阅读
  2. C++Linux网络编程Day1

    2024-07-09 19:50:03       46 阅读
  3. linux网络----UDP编程

    2024-07-09 19:50:03       57 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-09 19:50:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-09 19:50:03       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-09 19:50:03       58 阅读
  4. Python语言-面向对象

    2024-07-09 19:50:03       69 阅读

热门阅读

  1. 裸金属服务器与物理服务器之间的区别

    2024-07-09 19:50:03       22 阅读
  2. 精准注入:掌握Conda包依赖注入的艺术

    2024-07-09 19:50:03       28 阅读
  3. Haproxy搭建Web群集

    2024-07-09 19:50:03       25 阅读
  4. 同步的艺术:Conda包依赖的自动同步策略

    2024-07-09 19:50:03       30 阅读
  5. Shell学习——Shell运算符

    2024-07-09 19:50:03       43 阅读
  6. ECharts 饼图:数据可视化的重要工具

    2024-07-09 19:50:03       32 阅读
  7. react之错误边界

    2024-07-09 19:50:03       25 阅读
  8. 代码随想录算法训练营:27/60

    2024-07-09 19:50:03       33 阅读
  9. Websocket

    2024-07-09 19:50:03       41 阅读
  10. 力扣56.合并区间

    2024-07-09 19:50:03       39 阅读
  11. Android多用户基础问题

    2024-07-09 19:50:03       27 阅读