目录
前言
一、网络体系架构
1.1 OSI
1.2 TCP/IP协议簇体系架构
二、TCP和UDP的不同
1.TCP
2.UDP
三、网络编程基础相关概念
1.字节序
1.在计算机中有关多字节整数的存储方式,根据主机CPU处理数据的方式不同,我们将主机分为大端存储和小端存储
2.验证主机存储方式
3.根据不同的主机数据交换需要考虑端序的转换
4.何时使用字节序转换相关函数
2.ip地址
1.IP地址是计算机在网络中的唯一标识,由两部分组成
2.作用:
3.ip地址的分类
4.ip地址的划分,分别是A,B,C,D,E类网络
5.一个局域网下的特殊ip地址
6.点分十进制
四.子网掩码
五、端口号
六、域名分析
前言
为什么要学习网络编程?
1.进程间通信方式
1. 内核提供三种:
无名管道
有名管道
信号
2.system V提供三种:
消息队列
共享内存
信号灯集
上述通信方式中,只能实现同意主机之间多个进程之间的通信,并不能实现跨主机的通信方式
所以,引入了socket套接字通信
一、网络体系架构
OSI开放系统互联模型
每一层都有自己独立的功能,单每一层都不可获取
分层的好处:
1.各层之间独立,每一层不需要知道下一层如何实现,仅仅只需要知道该层通过层间接口所提供的服务
2.稳定,灵活性好,当任何一层发生变化时,只需要层间接口关系保持不变,这层的上下层不受影响3.易于实现和维护(知道是什么功能,就到指定层去查找)
4.促进标准化工作:每一层的功能及所提供的服务都有精确的说明
5.结构上不可分割开:各层都可以采用最适合的技术来实现
1.1 OSI
OSI共有7层:
从上到下的顺序 :应用层 表示层 会话层 传输层 网络层 链路层 物理层
1.2 TCP/IP协议簇体系架构
从上到下:应用层 传输层 网络层 链路层
应用层:
http:超文本传输协议
ftp:文件传输协议 使用TCP传输
tftp :简单文件传输协议 使用Udp传输
smtp :简单邮件传输
传输层:
TCP 传输控制协议
UDP用户数据报协议
网络层:
ip 网际互连协议
ICMP:互联网控制协议
IGMP:互联网组管理
链路层:
ARP:地址解析协议
RARP:逆向地址解析协议
注意:
每层使用的协议由下层决定,不能乱用
二、TCP和UDP的不同
1.TCP
1.面向连接的,可靠的,面向字节流的传输控制协议
2.传输过程中,数据无误,无丢失,无失序,无重复
3.数据传输效率低,耗费资源多
4.数据收发不同步
使用场景:对传输质量需求高,以及传输大量数据的通
2.UDP
1.面向无连接的,不可靠的,尽最大努力传输的协议
2.数据传输过程中,可能会出现数据丢失,重复,失序现象
3.数据传输效率高,实时性高
4.收发是同步的,不会沾包
5.使用场景:发送小尺寸的,在接收数据给出应答比较困难的情况下
例如:广播。音视频
三、网络编程基础相关概念
1.字节序
1.在计算机中有关多字节整数的存储方式,根据主机CPU处理数据的方式不同,我们将主机分为大端存储和小端存储
大端存储:低地址位存储数据的高位的存储方式
小端存储:低地址位存储数据的低位的存储方式
2.验证主机存储方式
#include<myhead.h> int main(int argc, const char *argv[]) { #if 0 /*****使用指针的方式验证主机大小端*******/ //定义一个整形变量 int num = 0x12345678; //找到num的起始地址 char *ptr = (char *)# //定义一个字符指针,指向num的第一个字节的地址 //判断该字节中的数据 if(*ptr == 0x12) { printf("big endian\n"); }else if(*ptr == 0x78) { printf("little Endian\n"); } #endif /********使用共用体的方式验证***********/ //定义一个共用体 union Data { int num; char value; }; //定义共用体变量 union Data ud; ud.num = 0x12345678; //给第一个成员赋值 //判断第二个成员的值 if(ud.value == 0x12) { printf("big endian\n"); }else if(ud.value == 0x78) { printf("little Endian\n"); } return 0; }
3.根据不同的主机数据交换需要考虑端序的转换
主机字节序:本地主机存储多字节整数的方式,分为大端存储和小端存储
网络字节序:多字节整数在网络中传输的存储方式称为网络字节序,规定网络字节序为大端存储
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong); //将4字节无符号整数的主机字节序转换为网络字节序,参数是主机字节序,返回值是网络字节序
uint16_t htons(uint16_t hostshort); //将2字节无符号整数的主机字节序转换为网络字节序,参数是主机字节序,返回值是网络字节序
uint32_t ntohl(uint32_t netlong); //将4字节无符号整数的网络字节序转换为主机字节序,参数是网络字节序,返回值是主机字节序
uint16_t ntohs(uint16_t netshort); //将2字节无符号整数的网络字节序转换为主机字节序,参数是网络字节序,返回值是主机字节序
4.何时使用字节序转换相关函数
1.在进行多字节整数网络传输时,需要使用字节序的转换
2.对于单字节整数传输时,无需使用字节序的转换
3.对于字符串的传输时,无需使用字节序的转换
2.ip地址
1.IP地址是计算机在网络中的唯一标识,由两部分组成
网络号:确定计算机所丛的从属的网络
主机号:标识设备在该网络下的一个编号
2.作用:
在网络传输中,给网络传输载体源ip地址和目的ip地址,以便找到对应的主机
3.ip地址的分类
ipv4
ipv6
4.ip地址的划分,分别是A,B,C,D,E类网络
A类地址 | 1.0.0.0~127.255.255.255 | 2^7(网络号) | 2^24(主机号) | 已经保留不在供给 |
B类地址 | 128.0.0.0~191.255.255.255 | 2^14 | 2^16 | 名地址网管中心 |
C类地址 | 192.0.0.0~223.255.255.255 | 2^21 | 2^8 | 校园网或企业网、家庭网 |
D类地址 | 224.0.0.0~239.255.255.255 | 组播地址 | ||
E类地址 | 240.0.0.0~255.255.255.255 | 保留 |
5.一个局域网下的特殊ip地址
1.网络号+0:表示该网络,不分配给任何主机使用
2.网络号+255:广播地址,不分配给任何主机使用
3.网络号+1:默认为网关地址
4.127.0.0.1:本地环回地址,用于主机内部自测使用
5.0.0.0.0:表示当前局域网的任意一个主机号
6.255.255.255.255:一般表示广播
6.点分十进制
in_addr_t inet_addr(const char *cp);
功能:将ip地址的点分十进制数据转换为网络字节序的整数
参数:ip地址的点分十进制字符串
返回值:网络字节序的ip地址的整数表示
char *inet_ntoa(struct in_addr in);
功能:将ip地址的网络字节序转换为点分十进制的字符串
参数:ip地址的网络字节序整数
返回值:点分十进制字符串
四、子网掩码
1.子网掩码是对主机好的二次划分,可以将主机号分为子网号+主机号
2.linux中可以使用指令ifconfig查看当前网络默认的子网掩码
3.子网掩码:由一组连续的1和连续的0组成,格式类似ip地址
4.子网掩码的使用:IP地址&子网掩码==》子网网段
5.默认子网掩码:网络号全为255+主机号全为0
示例:
192.168.125.64 --> 255.255.255.0(默认子网掩码) A类网络子网掩码:255.0.0.0 B类网络子网掩码:255.255.0.0 C类网络子网掩码:255.255.255.0 D类网络、E类网络没有子网掩码 1、对于192.168.125.64这个ip地址使用默认子网掩码 11000000 10101000 01111101 01000000 & 11111111 11111111 11111111 00000000 —————————————————————————————————————————— 11000000 10101000 01111101 00000000 ----> 192.168.125.0/24 说明该ip地址属于该子网网段 2、 对于192.168.125.200这个ip地址使用默认子网掩码 11000000 10101000 01111101 11001000 & 11111111 11111111 11111111 00000000 —————————————————————————————————————————— 11000000 10101000 01111101 00000000 ----> 192.168.125.0/24 说明该ip地址属于该子网网段 3、对于192.168.125.64这个ip地址使用 255.255.255.128的子网掩码 11000000 10101000 01111101 01000000 & 11111111 11111111 11111111 10000000 —————————————————————————————————————————— 11000000 10101000 01111101 00000000 ----> 192.168.125.0/25 说明该ip地址属于该子网网段 4、 对于192.168.125.200这个ip地址使用255.255.255.128的子网掩码 11000000 10101000 01111101 11001000 & 11111111 11111111 11111111 10000000 —————————————————————————————————————————— 11000000 10101000 01111101 10000000 ----> 192.168.125.128/25 说明该ip地址属于该子网网段 5、 对于192.168.125.60这个ip地址使用 255.255.255.192的子网掩码 11000000 10101000 01111101 00111100 & 11111111 11111111 11111111 11000000 —————————————————————————————————————————— 11000000 10101000 01111101 00000000 ----> 192.168.125.0/26 说明该ip地址属于该子网网段 6、 对于192.168.125.100这个ip地址使用 255.255.255.192的子网掩码 11000000 10101000 01111101 01100100 & 11111111 11111111 11111111 11000000 —————————————————————————————————————————— 11000000 10101000 01111101 01000000 ----> 192.168.125.64/26 说明该ip地址属于该子网网段 6、 对于192.168.125.130这个ip地址使用 255.255.255.192的子网掩码 11000000 10101000 01111101 10000010 & 11111111 11111111 11111111 11000000 —————————————————————————————————————————— 11000000 10101000 01111101 10000000 ----> 192.168.125.128/26 说明该ip地址属于该子网网段 6、 对于192.168.125.200这个ip地址使用 255.255.255.192的子网掩码 11000000 10101000 01111101 11001000 & 11111111 11111111 11111111 11000000 —————————————————————————————————————————— 11000000 10101000 01111101 11000000 ----> 192.168.125.192/26 说明该ip地址属于该子网网段
总结:子网网段的个数=2^(子网中1的个数)
子网网段下的主机个数=2^(子网中0的个数)
五、端口号
1.为了区分同一主机的多个进程,使用端口号来进行处理
2.端口号是一个2字节的无符号整数存储
3.网络通信的两个决定性因素:ip+端口号
4.端口号的分类:
0~1023端口我们编程时候不要使用,是那些”VIP“应用程序占了
TCP 21端口:FTP文件传输服务
TCP 23端口:TELNET终端仿真服务
TCP 25端口:SMTP简单邮件传输服务
TCP 110端口:POP3邮局协议版本3
TCP 80端口:HTTP超文本传输服务
TCP 443端口:HTTPS加密超文本传输服务
UDP 53端口:DNS域名解析服务
UDP 69端口:TFTP文件传输服务
特殊的端口函数,存储在linux中的 /etc/services文件中
六、域名分析
一个域名可以绑定多个ip
域名结构:
例如域名 http: //www.baidu.com.cn 从右向左看
cn为高级域名,也叫一级域名,它通常分配给主干节点,取值为国家名,cn代表中国
com为网络名,属于二级域名,它通常表示组织或部门
中国互联网二级域名共40个,edu表示教育部门,com表示商业部门,gov表示政府,军队mil等等
baidu为机构名,在此为三级域名,表示百度
www:万维网world wide web,也叫环球信息网,是一种特殊的信息结构框架。
http:使用的是超文本传输协议