Linux系统编程——网络
一、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,syn,fin?),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)中找
使用共享内存的方式(不需要用户和内核反复进行复制)