Linux 学习记录29(网络编程篇)
本文目录
本篇大纲
- 网络基础概念
- 协议
- IP地址
- 子网掩码
- TCP/UDP
- 字节序
- TCP服务器/客户端 UDP服务器/客户端 基于TCP的放置机械臂测试
- 基于UDP的tftp文件传输客户端 广播和组播
- 循环服务器 多进程并发服务器 多线程并发服务器 unix域套接字
- IO多路复用:select poll服务器
- 抓包工具的使用(三次握手,四次挥手) 数据库sqlite3:sql
- sqlite3的API
一、网络基础
1. 网络编程的概念
1. 网络编程就是进程间的通信,只不过多个进程间不一定在同一台主机说
2. 由于不在同一个主机上,在同一个主机上就需要注意协议
2. 联网协议和层
联网协议:定义如何在一个网络传输信息的一组规则
(1. 网络采用分层思想
1. 每一层都有自己独立的功能,但是每一层都不可获取
2. 通常把功能相近的协议们组织在一起,放在一层,协议栈。所以每一层中其实有多个协议。
分层的好处:
- 各层之间独立,每一层不需要知道下一层如何实现,而仅仅只需要知道该层通过层间的接口所提供的的服务。
- 稳定,当任何一层发生变化时,只要层间接口关系保持不变,则这层以上或以下层不受影响。
- 易于实现和维护 (知道是什么功能,就到指定层去查找)
- 促进标准化工作
(2. OSI体系结构(重点)
ISO(国际标准化组织)制定了一个国际标准OSI(开放式通讯系统互联参考模型),对通讯系统进行了标准化。
定义了7层体系结构
二、TCP/IP协议介绍
windows下查看IP
windows+R 输入cmd回车
输入ipconfig然后回车或者ipconfig/all
查看IP
+/all
1. 网络接口与物理层
也叫做网络访问层
- 功能:包括ip地址与物理地址的映射 (MAC)
- MAC:物理地址,48bit全球唯一,网络设备的身份标识 (cmd —> ipconfig/al) ,由厂商出厂后确定,由电气电子工程协会IEEE定义的
- ARP/RARP: 地址解协议/逆向地址解析协议
- ARP (Address Resolution Protocol) : 通过ip地址获取其对应的mac地址
- RARP (Reverse Address Resolution Protocol) : 通过mac地址获取其对应的ip地址
- PPP (Point to Point Protocol) 协议: 拨号协议 (GPRS/3G/4G)
2. 网络层
负责在主机之间的通讯中选择数据包传输的路径,即选择路由
- IP协议 (Internet Protocol)
ip协议根据数据包的目的ip地址来决定如何投递数据包
如果数据包不能直接投递给目标主机,那么ip协议就为他寻找下一个合适的下一跳路由器
- ICMP协议 (Internet Control Management Protocol)
英特网控制管理协议,ping检测网络就是用这个协议
用于在IP主机、路由器之间传递控制消息
- IGMP协议(nternet Group Management Protocol)
英特网分组管理协议,组播,广播。
3. 传输层
1. 负责提供应用程序之间通讯服务,这种服务又称之为端到端
2. 传输层与网络层不同,传输层只关心通讯的 起始端和 目的端,并不在乎数据包的传输中转过程
- TCP:(transmission control Protocol 传输控制协议) : 提供面向连接的,一对一的可靠数据传输协议
- UDP:(user datagram Protocol 用户数据报协议) : 提供无连接的,不可靠的尽力的传输协议,但是效率更高
4. 应用层
负责处理应用程序的逻辑
- .HTTP/HTTPS
超文本传输协议,万维网数据通信的基础
http:明文发送,https加密传输
- 邮件协议
- 收:POP3(post office protocol) 邮局协议第三个版本,从服务器接收右键,接收完后服务器就没有这个邮件了
- 发:SMTP(简单邮件传输协议)
- IMAP:交互式邮件存储协议,与POP3类似的邮件访问标准协议之一 ,收取邮件后,服务器上邮件依然存在,如果删除、标记服务器也会做相应操作.
- FTP (FILE Transfer Protocol)
文件传输协议,是用于在网络上进行文件传输的一套标准协议,使用TCP传输
- TFTP
简单文件传输协议,适用于在网络上进行文件传输的一套标准协议,使用UDP传输
- DNS:城名解析
Telnet/ssh: 远程登录
5. 网络拆包和分包
(1. MTU
Maximum Transmission Unit 最大传输单元
- 物理接口(数据链路层)提供给上层 (网络层(P层))最大一次传输数据的大小。
- 规定了数据链路层所能传送最大数据长度
- 以太网为例,缺省MTU=1500字节,这是以太网接口对IP层的约束
- 如果IP层<=1500字节需要发送,只需要一个P包就可以
- 如果IP层>1500字节需要发送,需要分片才能发送(分片: 顿)
(2. MSS
Maximum Segment Size 最大报文长度
- TCP提交给IP层最大分段大小,指TCP报文所允许传送数据部分最大长度
- 不包含TCP头,MSS式TCP来限制应用层最大发送字节数。
- 如果MTU=1500,则MSS = 1500-20IP header)-20(TCP header) =1460字节
- 如果应用有2000字节要发,需要2 Segment
- 第一个TCP Seqment= 1460 第二个TCP Segment = 540
三、TCP和UDP的异同点(重点)
相同点:同属于传输层协议
- TCP协议
- 提供面向连接的,可靠的数据
- 数据无误,数据无丢失,数据无重复到达的通信
(1. 序列号:每一个数据包都会编上一个序号,该编号称之为序列号,且每个序列号都需要应答包应答
(2. 应答包:应答序列号的
- 传输效率低,耗费资源多
- 数据发送和接收是不同步的,存在粘包现象。(不存在数据边界)
(1. 由于TCP效率比较低,所以将多个足够小,且发送间隔短的数据包粘成一个包发送,该算法称之为nagle算法
适用场景:对于传输质量要求比较高,以及大量数据传输的情况
- UDP协议
1.无连接的,不可靠,尽力的 传输协议
2. 不能保证数据的可靠性,数据可能在传输的过程中丢失,或出现失序或者重复到达的情况
3. 传输效率高
4. 限制每次传输的大小,超出部分直接删除
5. 数据的发送和接收是同步的,不会粘包
适用场景:适用于发送小尺寸的数据,在接收数据包给出应答比较困难的网络中使用
四、IP地址
IP地址是因特网中主机的标识,每个数据包都必须携带目的IP地址和源IP地址,路由器依靠此信息为数据包选择路由。
1. IP地址的分类
- IPV4:本质上是4字节,无符号的32位的整数。取值范围:0~232-1=42.9亿
局域网:为了解决IP地址不够的问题,让多个人使用同一个广域网IP
局域网IP是由路由器下发的,在路由器界面可以设置局域网IP的分配方式
若要 访问外网,则需要通过广域网IP地址访问外网
LAN:localArea Network 局域网
WAN:wide Area Network 广域网
- IPV6:本质上是16个字节,128位无符号整数。取值范围:0~2128-1
IPV4和IPV6不兼容
2. IP地址的划分
由于IP地址基数比较大,所以为了提高寻径效率,则将IP地址划分成二级IP地址;
二级IP地址 = 网络号+ 主机号
1. 网络号: 确定计算机从属的物理网络地址
2. 主机号: 确定网络号后,用主机号标识该网络号中的所有主机。
IPV4网络划分
0-7 |8-15|16-23|24-31|
0000|0000| 0000| 0000|
A类:{
0-7:网络号,且0位固定为0
8-31:主机号
}
B类:{
0-15:网络号,且0,1位固定为1,0
1-31:主机号
}
C类:{
0-23:网络号,且0,1,2固定为1,1,0
24-31:主机号
}
D类:{组播或多播
0-31:均为网络号,且0,1,2,3固定为1,1,1,0
无:主机号
}
E类{保留今后使用,或实验室用
0-31:均为网络号,且0,1,2,3固定为1,1,1,1
无:主机号
}
总结:
1. A,B,C,类为基本类,他们用于主机地址,分配给主机使用
2. D类不表示网络,用于特殊用途,组播 (多播)
3. E类保留今后使用,或者实验室使用
3. 点分十进制
为了方便记忆,使用点分十进制。
将32位IP地址的二进制数,以8bit为一组,用十进制表示,利用点分割。
IP分类 | IP范围 | 网络号 | 主机号 | 网络类型 |
---|---|---|---|---|
A类地址 | 0.0.0.0~127.255.255.255 | 27 | 224 | 大型网络 |
B类地址 | 128.0.0.0~191.255.255.255 | 214 | 216 | 名地址网管中心 |
C类地址 | 192.0.0.0~223.255.255.255 | 221 | 28 | 校园网或企业网、家庭网 |
D类地址 | 224.0.0.0~239.255.255.255 | - | - | 组播地址 |
E类地址 | 240.0.0.0~255.255.255.255 | - | - | 保留或实验室 |
特殊IP(不会分配给主机使用)
- 网络地址:有效网络号+全是0的主机号,代表该网络
- 广播地址:有效网络号+全是1的主机号,向该IP地址发送数据代表向该网络环境中的所有主机发送数据
4. 子网掩码(重点)
二级IP地址划分后,主机的基数还是比较大,所以引入了另外一个概念:子网掩码。利用子网掩码可以将主机号进行再次划分
子网掩码:它是用来划分IP地址中哪一部分属于网络号,哪一部分属于子网号,哪一部分属于主机号的。
IP = 网络号 + 子网号 + 主机号
三级划分比较灵活,可以选择划分也可以选择不划分,可以选择划分出2部分,4部分,8部分…2n。
子网掩码:与IP地址一样长的32位无符号整数,由一串连续的1后面跟着一串连续的0组成。
1. 默认情况下1的个数与IP地址中网络号的个数一致
2. 默认情况下0的个数与IP地址中主机号的个数一致
A类IP的默认子网掩码:
11111111 00000000 00000000 00000000
即:255.0.0.0
B类IP的默认子网掩码:
11111111 11111111 00000000 00000000
即:255.255.0.0
C类IP的默认子网掩码:
11111111 11111111 11111111 00000000
即:255.255.255.0
D类和E类没有子网掩码
用法
IP & 子网掩码=子网网段
例:192.168.2.145 & 255.255.255.0 = 192.168.2.0
所以 192.168.2.0 为 192.168.2.145 的子网网段
子网网端也可以写作192.168.2.0/24:24代表子网掩码中有24个1
=======================================================
子网掩码:11111111 11111111 11111111 00000000 = 255.255.255.0
修改子网掩码:11111111 11111111 11111111 10000000 = 255.255.255.128
注:子网掩码的修改必须保证0和1是连续的
计算子网网段:192.168.2.145 & 255.255.255.128 = 192.168.2.128
此时分为两个子网
分别为:192.168.2.0/25 和 192.168.2.128
五、网关
网关是一个网络通向其他网络的IP地址,通常用来汇总数据
目前家用路由器一般使用192.168.1.1和192168.0.1作为LAN接口的地址,这个两个也是最常用的网关地址
一般使用网段内.1的IP地址
六、域名系统
由于使用IP地址来指定计算机不方便人们记忆,且输入时候容易出错,用字符标识网络种计算机名称方法。这种命名方法就像每个人的名字,这就是域名(Domian Name)
- 域名服务器(Domain Name server): 用来处理IP地址和域名之间的转换。
- 域名系统(Domain Name Svstem,DNS):域名翻译成IP地址的软件
一个域名,可以绑定多个ip
域名结构:例如域名 wwwbaidu.com.cn从右向左看
1. cn为高级域名,也叫一级域名,它通常分配给主干节点,取值为国家名,cn代表中国
2. com为网络名,属于二级域名,它通常表示组织或部门
3. 中国互联网二级域名共40个,edu表示教育部门,com表示商业部门,gov表示政府,军队mil等等
4. baidu为机构名,在此为三级域名,表示百度
5. www: 万维网world wide web,也叫环球信息网,是一种特殊的信息结构框架
七、端口
为了区分一台主机收到的数据包交给哪个进程处理,使用端口号来区分。程序启动后将端口号和进程绑定在一起
1. 网络里面的通讯是由:IP地址+端口号来决定
2. 端口号存储在 2个字节无符号整数中 (unsigned short int) 。[1,65535]
1~1023端口我们编程时候不要使用,是那些"VIP"应用程序占了
服务器端口号 | 功能 |
---|---|
TCP21端口 | FTP文件传输服务 |
TCP23端口 | TELNET终端仿真服务 |
TCP25端口 | SMTP简单邮件传输服务 |
TCP110端口 | POP3邮局协议版本3 |
TCP80端口 | HTTP超文本传输服务 |
TCP443端口 | HTTPS加密超文本传输服务 |
UDP 53端口 | DNS域名解析服务 |
UDP69端口 | TFTP文件传输服务 |
TCP和UDP的端口号是相互独立的
可以使用的: 1024~49151,就是我们平时编写服务器使用的端口号
临时端口号:49152~65535,这部分是客户端运行时候动态选择的
八、跨主机传输
1.字节序
(1. 字节序的概念
字节序是指不同类型CPU主机,内存存储多字节整数序列的方式
- 浮点类型,字符类型,字符串这些类型没有字节序的说法
- short,int long,long long才有字节序的说法
小端字节序:低序字节存储在低地址上
大段字节序:低序字节存储在高地址上
指针都是指向低地址的,且所有的数据都是从低地址往高地址读取,经过大小端转换得出结果.
使用联合体判断大小端
typedef union
{
int buff;
char num;
}buff_type;
int main(int argc, char const *argv[])
{
buff_type test;
test.buff = 0x12345678;
int i;
for(i=0; i<4; i++)
{
printf("%#x ",*(&test.num+i));
}
printf("\n");
return 0;
}
输出>>
0x78 0x56 0x34 0x12