网络编程 Day1
- 为什么要学习网络编程?
- 网络发展历史
- APRAnet阶段
- TCP/IP两个协议阶段
- 网络体系结构及OSI开放系统系统互联模型
- 网络体系结构概念
- OSI开放系统互联模型
- TCP和UDP异同
- 网络基础相关的概念
- 字节序
- IP地址的转换
- IP地址
- 子网掩码
- 端口号
为什么要学习网络编程?
- 进程间通信方式
内核提供三种:无名管道、有名管道、信号
System V提供三种:消息队列、共享内存、信号灯集 - 以上通信方式,都是通过内核空间完成,在同一主机之间多个进程通信没有问题,但是,不同主机的内核空间是不同的,所以,无法做到跨主机之间多个进程之间的通信
- 引入第七种进程间通信:套接字通信,完成跨主机多进程之间通信方式
网络发展历史
发展阶段:
- APRAnet阶段—冷战产物
- TCP/IP协议阶段–只有TCP和IP两个协议
- osi开放系统互联模型
- TCP/IP协议族(重要)
- 量子通信(可能)。
APRAnet阶段
阿帕网,是Interne的最早雏形
不能互联不同类型的计算机和不同类型的操作系统
没有纠错功能。
TCP/IP两个协议阶段
在计算机网络中,要做到有条不紊的交换数据,需要遵循一些事先约定好的规则。这些规则明确规定了所交换的数据的格式以及有关的同步问题。为了进行网络中的数据交换而建立的规则、标准和约定称为网络协议
联网协议:定义如何在一个网络上传输信息的一组规则
TCP/IP协议分成了两个不同的协议:
用来检测网络传输中差错的传输控制协议TCP
专门负责对不同网络进行互联的互联网协议IP
网络体系结构及OSI开放系统系统互联模型
网络体系结构概念
每一层都有自己独立的功能,单每一层都不可获取
通常把功能相近的协议组织在一起放在一层,协议栈。所以每一层中其实有多个协议
分层的好处:
- 各层之间独立,每一层不需要知道下一层如何实现,而仅仅只需要知道该层通过层间的接口所提供的服务
- 稳定,灵活性好,当任何一层发生变化时,只需要层间接口关系保持不变,而这层以上或以下层不受影响
- 易于实现和维护(知道是什么功能,就到指定层去查找)
- 促进标准化工作:每一层的功能及其所提供的服务都有了精确的说明。
- 结构上不可分割开:各层都可以采用最合适的技术来实现
OSI开放系统互联模型
TCP/IP网络体系结构四层:
应用层
传输层
网络层
链路层(网络接口和物理层)
与七层模型对应的关系
数据帧
一帧数据的说明
大小为 64–1518(包含以太网的头部14字节、尾部4字节)
如果数据大于MTU(最大传输单元,linux默认是1500),需要分成多次进行传输
可以使用指令ifconfig查看MTU最大传输单元
TCP和UDP异同
共同点:同属于传输层的协议
TCP ----> 稳定
- 提供面向连接的,可靠的数据传输服务
- 传输过程中,数据无误、数据无丢失、数据无失序、数据无重复
- TCP会给每个数据包编上编号,该编号称之为序列号
- 每个序列号都需要应答包应答,如果没有应答,则会将上面的包重复发送直到正确为止 - 数据传输效率低,耗费资源多
- 数据收发是不同步的
- 为了提高效率,TCP会将多个较小,并且发送间隔短的数据包,沾成一个包发送,该现象称为沾包现象
- 该沾包算法称之为Nagle算法 - TCP的使用场景:对传输质量比较高的以及传输大量数据的通信,在需要可靠通信的传输场合,一般使用TCP协议
例如:账户登录,大型文件下载的时候
UDP ----> 快速
- 面向无连接的,不保证数据可靠的,尽最大努力传输的协议
- 数据传输过程中,可能出现数据丢失、重复、失序现象
- 数据传输效率高,实时性高
- 限制每次传输的数据大小,多出部分直接忽略删除
- 收发是同步的,不会沾包
- 适用场景:发送小尺寸的,在接收到数据给出应答比较困难的情况下
例如:广播、通讯软件的音视频
TCP 3次握手,4次挥手
网络基础相关的概念
字节序
- 不同类型的CPU主机中,在处理多字节整数序列时有两种存储方式,称为主机字节序
大端存储(big_endian):地址低位存储数据高位
小端存储(little_endiab):地址低位存储数据低位 - 由于多字节整数需要跨主机通信,对于不同的主机存在大小端存储的不同,会导致,即使网络传输中数据无误,也会展现出错误信息
基于此,引入了网络字节序的概念,要求多字节整数,在网络中传输时,都转换为网络字节序,网络字节序是大端存储
无论主机字节序是大端还是小端存储,发送到网络之前先转换为网络字节序。当接收端接收消息后,再将网络字节序转换为主机字节序即可。 - 系统提供了主机字节序和网络字节序相互转换的函数
h:host主机
to:转换
n:net网络
l:long整型
s:short短整型
API
typedef int uint32_t
typedef short uint16_t
#include <arpa/inet.h>uint32_t htonl(uint32_t hostlong);将4字节主机字节序转为4字节网络字节序 uint16_t htons(uint16_t hostshort);将2字节主机字节序转为2字节网络字节序uint32_t ntohl(uint32_t netlong);将4字节网路字节序转为4字节主机字节序uint16_t ntohs(uint16_t netshort);将2字节的网络字节序转为2字节的主机字节序
IP地址的转换
IP地址转换位网络字节序或者网络字节序转换为IP地址
in_addr_t inet_addr(const char *cp);功能:将字符串类型的IP地址转为网络使用的ip号。char *inet_ntoa(struct in_addr in);功能:将网络使用的ip号转为字符串类型的IP地址。
IP地址
- ip地址是主机在网络中的标识,每个数据包必须携带目的ip地址和原ip地址,路由器就是依照此信息进行路由选择的
- 也是对网络标识的二级划分
- IP地址的种类(局域网和广域网的划分)
- IPV4:4字节无符号整数表示(2^32)
- LAN:局域网覆盖较小范围,传输速度快,延时低。
- WAN:广域网覆盖范围大,乃至全球范围,速度慢,延时高。
- IPV616字节无符号整数表示(2^128)
- IPV4地址的划分
IP地址 = 网络号+主机号
当前阶段IP地址分为5类
子网掩码
- 由于对于一个网络下面的主机号还是很庞大,为了进一步划分网络,我们可以将主机号再次进行划分为两部分,分别是子网网段和主机号
- 此时就引入的子网掩码的概念
- 在引入子网掩码后,IP = 网络号 + 子网号 + 主机号
- 子网掩码:用于ip地址的三级划分,划分时,用户可以选择划分,也可以不划分,如果不划分,就使用默认的子网掩码
- 定义格式:与IP地址一样长的32位整数,由一串连续的1和一串连续的0组成
- 默认子网掩码:子网掩码就是某类网络的 网络号全是1,主机号全是0的值。
- 子网掩码的使用:ip地址 & 子网掩码 ==> 子网网段
端口号
eg:192.168.125.88:5885
5885附加在IP后面表示端口号。
-
端口号是能够实现网络端对端的通信
-
是主机中某个进程的标识,由于某个进程关闭后,再打开,pid会不断更改,所以,在启动一个进程时,可以指定端口号,标识该进程
-
端口号是一个2字节的无符号整数,取值范围[0,65535]
-
端口号的分类:
- 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文件传输服务
TCP和UDP的端口号是相互独立的
可以使用的:1024~49151,就是我们平时编写服务器使用的端口号
临时端口号:49152~65535,这部分是客户端运行时候动态选择的