1.网络编程基础
1.1引入
socket套接字实现主机之间的通信
cs通信模型基于socket实现,需要客户端软件来实现通信
bs通信模型基于http实现,是网页通信,不需要任何客户端软件
1.2通信协议
(1)OSI七层通信协议:物理层,链路层,网络层,运输层,会话层,表示层,应用层
(2)TCP/IP四层通信协议:网络接口层,网际层,运输层,应用层
(3)五层协议体系: 物理层,数据链路层,网络层,运输层,应用层
分层的好处:各层之间功能独立,每层的功能不需要通过上层或者下层间接得到,上层下层发生变化,不会影响这一层的功能,便于根据每层功能对每层进行查错和维护,促进标准化工作,结构上不可分割。
OSI和TCP/IP每层对比:
数据头:封包和拆包过程:
linux默认封装MTU一帧数据最大为1500字节。
1.3TCP和UDP区别
1.tcp面向有链接传输,有三次握手四次挥手机制,会给每个包编上序列号避免乱序,拥有确认包机制,有超时重传机制,有接收缓存区和发送缓存区,为了提高效率,会将多个小包数据沾成一个包发送,这种现象叫做粘包现象,具有网络拥堵检测,实时性较差,数据传输更稳定,不易造成数据丢失。
2.udp面向无连接传输,没有发送缓存区,有接收缓存区,尽最大努力传输,接收不及时会造成丢包,超过最大发送的数据大小会删掉多出的部分,实时性强,传输效率高,数据容易丢失乱序。
1.4字节序
网络字节序采用大端存储,数据低位存高地址,数据高位存低地址。
ip地址:网络号(三个字节)+主机号(一个字节),共四个字节,如:255.255.255.0
ip地址字节序转换函数:
将主机字节序转为网络字节序: inet_addr(const char*)
将网络字节序转为主机字节序:inet_ntoa(const char*)
端口号:占用两个字节,如:8888
端口号字节序转换函数:
将两字节无符号整数的主机字节序转为网络字节序:htons(uint16_t hostshort)
将两字节无符号整数的网络字节序转为主机字节序:ntohs(uint16_t hostshort)
1.5子网掩码
子网掩码是对主机号的二次划分,子网掩码将原ip划分为多个网段,每个网段绑定一定数量的子网ip地址。子网掩码会将一字节的主机号划分为四字节子网掩码:三字节网络号和一字节主机号,网络号全由1组成,主机号全由0组成。网络号可以向主机号借子网号,借来的子网号的值可以改变,因此可以将原ip划分为多个网段。C类网络默认子网掩码是255.255.255.0
子网地址 = 原ip地址&多个子网掩码(子网掩码个数取决于从主机号借用的子网号的个数)
两个特殊的ip:
主机号全为0:标识网络的起始地址,主机不可用
主机号全为1:全网广播地址,主机不可用
划分后最大的网段个数:2^(子网中1的个数)
划分后最大可用的主机个数:2^(子网中0的个数)-2
1.6端口号
TCP和UDP的端口号是相互独立的
可以使用的:1024~49151,就是我们平时编写服务器使用的端口号
临时端口号:49152~65535,这部分是客户端运行时候动态选择的
1.7域名
一个域名可以绑定多个ip,域名ip可通过shell指令查看:ping www.baidu.com
展示:ubuntu@ubuntu:~/test$ ping www.baidu.com
PING www.a.shifen.com (180.101.50.188) 56(84) bytes of data.
64 字节,来自 180.101.50.188 (180.101.50.188): icmp_seq=1 ttl=128 时间=8.91 毫秒
64 字节,来自 180.101.50.188 (180.101.50.188): icmp_seq=2 ttl=128 时间=13.2 毫秒
ubuntu@ubuntu:~/test$ ping www.baidu.com
PING www.a.shifen.com (180.101.50.242) 56(84) bytes of data.
64 字节,来自 180.101.50.242 (180.101.50.242): icmp_seq=1 ttl=128 时间=22.5 毫秒
64 字节,来自 180.101.50.242 (180.101.50.242): icmp_seq=2 ttl=128 时间=11.0 毫秒
通过上面的结果,可以看到百度官网的域名绑定了多个ip地址
域名结构:
例如域名 http: //www.baidu.com.cn 从右向左看
cn为高级域名,也叫一级域名,它通常分配给主干节点,取值为国家名,cn代表中国
com为网络名,属于二级域名,它通常表示组织或部门
中国互联网二级域名共40个,edu表示教育部门,com表示商业部门,gov表示政府,军队mil
baidu为机构名,在此为三级域名,表示百度
www:万维网world wide web,也叫环球信息网,是一种特殊的信息结构框架。
http:使用的是超文本传输协议
2.tcp和udp通信
1.套接字
套接字socket,通信的载体,使用socket函数创建通信节点,返回该端点的文件描述符,端点中包含发送缓存区和接收缓存区。
2.tcp通信程序
1.服务器端
2.客户端
3.udp通信程序
1.服务器端
2.客户端
3.广播和组播
1.广播
2.组播
4.流式域套接字和报式域套接字
用于本地通信。