Linux系统编程——网络

发布于:2025-07-25 ⋅ 阅读:(15) ⋅ 点赞:(0)

一、TCP/UDP

1、osi模型

物理层、数据链路层、网络层、传输层、会话层、表示层、应用层(下层为上层提供服务)

2、TCP/IP模型(TCP/IP协议栈)

应用层:

HTTP(超文本传输协议)、FTP(文件传输协议)、DNS、DHCP

传输层:

TCP(传输控制协议)、UDP(用户数据报)

网络层:

IP(互联网协议)、ICMP(互联网控制消息协议)ARP(ip->mac)RARP(mac->ip)

接口层:以太网协议....

3、常见的协议

DNS:域名解析

DHCP:动态主机配置协议,功能:自动分配IP地址

4、 ip地址

IP地址 == 网络位 + 主机位(ip地址的前三组是网络地址,第四组是主机地址)

有A B C D E 类五类地址

5、网络接口

套接字:用于网络通信的一组接口函数(文件描述符)

ip+port(地址+端口):地址用来识别主机,端口用来识别进程

端口号范围:1-65535

网络设备是大端存储,计算机设备是小端存储

6、udp特性(发不会阻塞,收会阻塞)

1. 无连接 
不需要维护繁杂网络状态。网络开销小。通信双方通信过程,无法知道对方进程关闭。如果需要告知,需要发信息通知。 (每次发数据,链路发完自动释放,下次发会选择新的链路)
2. 不可靠, 
传输数据的过程中,会有丢包。但是实时性好。适用直播 视频传输,音频传输。

3、数据报:数据间有边界,收发次数需要对应
【很容易实现一对多 、可以组播,广播】

7、UDP:客户端-服务端

8、网络模型

C/S:专用客户端,标准协议,自定义协议,功能复杂,大部分资源都在客户端(和本地客户端打交道)

B/S:通用客户端,超文本协议,功能相对较弱,资源都在服务器,(和浏览器打交道)

p2p模型:(peer to peer)用于直播,下载工具

9、TCP:传输控制协议(相当于打电话)特性:

1、有链接(一次会话中,链接会一直保持。如果一个断开,另外一方可以感知),

2、可靠:应答,超时重传

3、流式套接字:(有顺序、发送和接受的次数不需要对应,发的太快会出现写阻塞,数据之间没有边界)

注意:

数据之间没有边界会导致数据的黏包(接收收到数据后,无法正常解析)
1.协商边界
2.固定大小
3.自定义协议 

 10、TCP:客户端-服务端

重点代码:网络编程——聊天程序实现-CSDN博客

11、三次握手,四次挥手

三次握手:

客户端-->SYN(请求连接),c_num-->服务器

服务器-->SYN/ACK,s_num-->客户端

客户端-->ACK-->服务器

四次挥手:

客户端--> FIN(断开连接)/ACK -->服务器

服务器--> ACK -->客户端

服务器-->FIN/ACK-->客户端

客户端-->ACK-->服务器

 二、HTTP相关

1、网络协议头和工具

协议头(数据的封包和拆包)

客户端,从应用层发hello,经过传输层加tcp,网络层加ip,接口层加ip,变成一帧数据(mtu,最大传输单元1500字节,,分片?),经过互联网,到服务器逐层拆包,到服务器应用层输出hello.

  • MAC(以太网V2帧格式):目地址,源地址,ip数据报
  • IP(20个字节大小):ip flags(x d(能不能分片)m(是不是最后一片)),TTL(生存时间:默认值64,每经过一个网络节点ttl减1,数字减为0则不再继续传递)
  • TCP(20个字节大小):标志位(urg,ack,psh(抓包时:没有标准协议就找push,有标准协议就找相关协议),pst,synfin?),window(滑动窗口)

(UDP,8个字节大小)

2、网络测试工具:

telnet/ssh2:远程登录工具

netstat -anp/ping/arp:常用命令

wireshark:网络抓包工具

tcpdump:命令行抓包工具

3、万维网

统一资源定位符URL,标志万维网的各种文档(相当于网页链接)

HTTP的URL的一般形式:

http://<主机>:<端口>/<路径>

超文本传送协议HTTP,使用TCP可靠传输(加s就是加密传输)

超文本标记语言HTML

4、HTTP操作过程:

  • 客户端与服务器建立连接(三次握手)
  • 客户端发送请求报文
  • 服务器收到请求,发送响应报文+加对应数据
  • 断开连接(四次挥手)

5、HTTP报文结构

请求报文:

第一行:方法(get/post)+URL+HTTP版本号+回车换行\r\n

首部行:状态说明信息(键值对)

实体:请求实体(一般为空)

响应报文

三、多路IO复用(服务器和多客户端)

1、定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力

(进线程消耗资源,多路IO复用用最少的资源解决更多的事)

2、IO模型:

1、阻塞IO  闲等待(不占cpu等待):有名管道
2、非阻塞IO 忙等待(占着cpu等待)
3、信号驱动IO
4、并行模型 (进程/线程,相对多路IO比较消耗系统资源)
5、IO多路复用(可以处理单进程或单线程中,多个阻塞)

3、 fctnl设置非阻塞

 //将fd置为非阻塞模式
  int flag = fcntl(fd,F_GETFL,0);
  fcntl(fd,F_SETFL,flag|O_NONBLOCK);

//将标准输入(0)也设置为非阻塞模式。
  flag = fcntl(0,F_GETFL,0);
  fcntl(0,F_SETFL,flag|O_NONBLOCK);

4、fctnl设置信号驱动(代码运行和系统版本相关)(了解即可)

  //把设备设置为信号驱动的方式
  int flag = fcntl(fd,F_GETFL,0);
  fcntl(fd,F_SETFL,flag|O_ASYNC);
  //设置接收sigio信号的进程
  fcntl(fd,F_SETOWN,getpid());

5、IO多路复用:由操作系统提供的对IO事件进行检测的机制 (select,poll,epoll)

6、select函数实现多路IO复用(轮询方法)

创建集合(fd_set)

把文件描述符放进集合(FD_SET)

select轮询扫描,(返回值:有几个就是有几个描述符准备好)

找到对应的fd,进行读写操作(FD_LSSET)

清除读写标志位

注意点:

select最多检测1024fd

select在检测fd的方式是轮询的方式

select在找对应fd时,需要在原始集合(就绪和未就绪的在一个集合)找

7、epoll函数实现多路IO复用(主动上报)

创建集合 (epoll_create)

把文件描述符放进集合(epoll_ctl)

调用epoll_wait等待读写事件的到来,并把就绪fd存入就绪集合(rev)

在rev集合找到对应的fd,进行读写操作

注意点:

不限制文件描述符的限制

监听的性能不会随监听描述符增加而下降

epoll在rev集合(只有就绪fd)中找

使用共享内存的方式(不需要用户和内核反复进行复制)


网站公告

今日签到

点亮在社区的每一天
去签到