当前位置: 首页 > news >正文

Linux网络编程

网络:不同主机,进程间通信

目的

       1, 解决主机之间的硬件层面的互联互通

        2,解决主机间软件层面的互联互通

        

IP地址:区分不同主机(软件地址)

MAC地址:硬件地址

端口号:区分同一主机上的不同进程

协议:定义的网络标准

网络协议

1,OSI七层模型

        OSI:开放系统互联模型

应用层:要传输的数据信息,如文件传输,电子邮件等

表示层:数据加密,解密操作,压缩,解压缩

会话层:建立数据传输通道

传输层:传输的方式UDP  TCP 端口号

网络层:实现数据路由 路由器ip

数据链路层:封装成帧,点对点通信(局域网内通信),差错检测  交换机   ARP

物理层:定义物理设备标准,比如网线,光纤等传输介质   比特流bit  0  1

2,TCP/IP模型(五层模型)

       应用层:

                HTTP:超文本传输协议

                HTTPS:超文本传输协议

                FTP:文件传输协议

                TFTP:简单文件传输协议

                MQTT:消息队列遥测传输协议(物联网协议)

        传输层:

                UDP:用户数据报协议

                TCP:传输控制协议

                DNS:域名解析协议(域名和ip地址转换)

        网络层:

                IP协议:IPv4,IPv6

                网络接口层

                        ARP:地址解析协议

                IPv4: 32位                 192.168.1.23 ---》点分十进制

                IPv6: 128位:解决IP地址不够用问题


                        ipv4的:

                        网络位:子网掩码全为1的位是ip地址的网络位

                        主机位:子网掩码全为0的位是ip地址的主机位


                  端口号:16位的数据 0~65535,用于区分数据包属于哪个进程

                  

                  

        数据链路层:

        物理层:

                                                        



网络配置

        1,虚拟机---》设置----》网络适配器---》桥接模式

         2,编辑----》虚拟网络编辑器----》更改设置 ---》VMnt0----》桥接至---》PC正在上网的网卡----》应用---》确定

        3,配置网络文件

        打开网络配置文件:

        sudo vim /etc/network/interfaces


 auto loiface lo inet loopback
auto ens33iface ens33 inet dhcp
重启网络服务
sudo /etc/init.d/networking resta1t

        4,网络相关命令

        ping IP/域名

      www.baidu.com

        ifconfig:查看当前主机ip地址



网络协议:

传输层协议:

1.UDP(User Datagram Protocol)协议:用户数据报协议

User Datagram Protocol

2,网络编程框架

    B/S模型:browser/server(浏览器/服务器)通用的客户端(浏览器)----专业的服务器

    C/S模型:client/server(客户端/服务端)专用的客户端-----专用的服务器

3,UDP编码

 client / server

网络套接字:文件描述符,代表了底层封装出来的用于网络通信收发数据的端口。

       UDP特点:

      1,尽最大努力交付(不安全,不可靠(丢包,乱序))

      2,无连接

       3,面对数据报

       4,机制简单,传输效率高

        应用场景:

                要求实时性高,但是允许数据丢失(eg:直播)

4,函数接口

int socket(int domain, int type, int protocol);      ***
功能:创建一个通信套接字

参数:

        domain:IP层协议族

                        AF_INET:IPv4

                        AF_INET6:IPv6

        type:传输层使用的协议类型

        SOCK_DGRAM:        UDP

        SOCK_STREAM:        TCP        

        protocol: 0  按照默认协议方式

        成功:返回套接字

        失败:返回-1

  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:保存接收方地址信息的指针

        socklen_t addrlen:接收方地址变量的大小

返回值

        成功:实际发送的字节数

        失败:-1

网络字节序:大端

主机字节序:小端

uint32 thtonl(uint32 t hostlong);主机转网络

uint16 t htons(uint16 t hostshort);主机转网络

uint32 t ntohl(uint32 t netlong);网络转主机

uint16 t ntohs(uint16 t netshort);网络转主机

bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen) 
功能:绑定当前主机的ip和进程的端口 
参数: sockfd:套接字
        addr:自己信息的地址
        addrlen:地址信息的大小
 
返回值:成功:0

              失败:-1 

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:送发地址信息的首地址

返回值:

        成功:实际接收到的字节数

        失败: -1

2,TCP  :传输控制协议

UDPTCP
面向数据报面对数据流(流式套接字)

不安全不可靠

(尽最大努力交付)

安全可靠的传输协议
无连接建立连接

三次握手:TCP建立连接时,需要进行三次握手,确保收发数据前,双方都已准备就绪

四次挥手:TCP断开连接时,需要进行四次挥手,从而确保通信双方都已收发数据结束

TCP编程:
        C/S模型:

                        

  ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能:从TCP套接字接收数据

参数

        sockfd:套接字

        buf:保存接受数据内容的首地址

        len:期待接收到的字节数

        flags:0:默认方式

返回值

        成功:实际收到的字节数

        失败:返回-1

        0:当发送端套接字关闭时,recv将不在阻塞,返回0;

int listen(int sockfd, int backlog);

功能:监听套接字

参数

        sockfd:监听套接字

        backlog:最多允许同时访问的客户端个数

返回值:

        成功 : 0

        失败: -1       

        

  int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:接收建立三次握手的客户端并产生与之通信的套接字

参数:

        sockfd:监听套接字

        addr:保存客户端地址信息的变量指针

        addrlen:客户端地址大小的变量指针

返回值

        成功:返回通讯套接字

        失败:-1

HTTP协议:超文本传输协议

万维网www:大规模的联机式的信息储存所  英文名 web(服务器)

1,万维网服务器如何标记万维网文档?----->url:统一资源定位符

2,万维网客户端和万维网服务器如何通信?------>http:超文本传输协议

3,万维网客户端如何显示数据?------>heml:超文本标记语言

URL:

        

eg  :    https://mp.csdn.net/mp_blog/creation/editor/145919630?spm=1001.2014.3001.45

           https://www.baidu.com/------>主页

应用层: 

HTTP协议:浏览器与服务器直接的通信标准

端口号:80

传输层:tcp协议

2,HTTP报文格式:

连接方式:

Connextion:keep-alive

http的(tcp)连接方式

keep-alive:长连接,服务器不会立马断开,会等待一段实际断开

close:短链接,服务器在发送完数据的时候立马断开

(记上3~4个方法)



单循环服务器:服务器同一时刻只能相应一个客户端的请求

并发服务器:服务器同一时刻可以相应多个客户端的请求

UDP:无连接

TCP:有连接

构建TCP并发服务器:

让TCP服务端具备同时响应多个客户端的能力。

1多进程

        资源消耗大,同资源平台下,并发量小

2多线程

        创建线程,进程比较耗时

3,线程池

        提前预创建大量线程,避免任务执行过程中创建线程的耗时问题

4,IO多路复用

        在不创建新的进程和线程的前提下,可以在一个进程中

        同时检测多个IO(文件描述符fd/sockfd/connfd)

        

阻塞IO:read,recv,fgets,recvform

IO多路复用(转接):

在不创建新的进程和线程的前提下,可以在一个进程中同时检测多个IO

(文件描述符fd/sockfd/connfd)

优势:节省资源

不足:不利于处理比较耗时,延时比较长的任务

1,创建文件描述符集合

2,将关注的文件描述符加入到集合中

3,等待IO事件到达(调取函数)

4,根据不同的IO事件处理不同的任务

select:实现IO多路复用

 int select(int nfds, fd_set *readfds, fd_set *writefds,
                  fd_set *exceptfds, struct timeval *timeout);

功能:阻塞等待IO事件,返回事件结果

参数:

        nfds:关注的最大文件描述符+1

        readfds:文件描述符读事件集合表

        writefds:写事件集合表

        exceptfds:其他事件集合表

        time out :超时时间(不设置超时则置为空NULL)

返回值

        成功: 返回到达的事件个数

        失败:-1

        返回 0:超时时间到达但没有IO事件到达

       void FD_CLR(int fd, fd_set *set);
       int  FD_ISSET(int fd, fd_set *set);
       void FD_SET(int fd, fd_set *set);
       void FD_ZERO(fd_set *set);
 


​​​select不足之处

1,使用位图管理文件描述符,最多允许同时检测1024个文件描述符(有上限)

2,文件描述符集合在应用层创建,需要实现应用层和内核层的反复拷贝

3,需要应用层对集合表进行遍历,寻找到达的事件

4,只能工作在水平触发模式(低速模式),不能工作在边沿触发模式(高速模式)

相关文章:

  • Scala:case class(通俗易懂版)
  • 如何禁止电脑中某个应用联网
  • C++ 学生成绩管理系统
  • 腾讯云对象存储服务(COS)
  • 爬虫逆向:脱壳工具ZjDroid的使用详解
  • Oracle数据导入导出小工具(主要用于导入导出小批量含大字段的数据)
  • Linux - 网络套接字
  • MVC模式全解析
  • 鸿蒙全栈开发 D2
  • PromotionNotice对象获取异常记录
  • 十二、OSG学习笔记-Control
  • 手游ASO优化:2025年核心策略与未来趋势
  • DropDown的使用总结
  • C/C++蓝桥杯算法真题打卡(Day1)
  • 如何面向DeepSeek编程,打造游戏开发工具集,提升工作效率
  • 缓存雪崩 缓存击穿 缓存穿透
  • 综合使用pandas、numpy、matplotlib、seaborn库做数据分析、挖掘、可视化项目
  • Django 中,Form 和 ModelForm的用法和区别
  • 在虚拟机上安装Hadoop
  • 基于单片机的速度里程表设计(论文+源码)
  • 高端网站设计元素图片/安仁网络推广
  • 易捷商城小程序/福州seo公司排名
  • 浙江网站设计 site/2021年度关键词有哪些
  • 福州短视频seo程序/合肥百度关键词优化
  • 股票app开发价格/站长工具 seo查询
  • 新网站做seo优化步骤/百度推广电话销售好做吗