1、网络编程
进程间通信仅局限于同一主机之间多个进程间通信方式,不能实现跨主机的通信方式。因此想要实现跨主机的通信方式,需引入套接字的通信方式。
2、网络的体系结构
2.1概念
- 每一层都有自己独立的分工,其它层不可获取
- 功能相近的协议组织放在一层,称为协议栈,所以每一层其实有多个协议
- 各层之间相互独立,每一层不需要知道下一层如何实现,只需要知道该层通过层间接口锁提供的服务
- 优点:稳定,灵活性好
- 易于实现和维护,只要知道那一层的功能,就能直接对指定层进行维护
- 结构上是不可分割的,各层之间都采用的最合适的技术来实现
2.1.1、OSI(七层)
- 面向应用--->应用层:FTP、E-mail、Telnet
- 面向服务:
表示层:数据格式定义、数据转换/加密
会话层:建立、管理、终止会话;提供同步点、会话恢复、单双工通信控制 - 面向通信:传输层--->差错处理/恢复,流量控制,提供可靠的数据传输
- 通信子网:
网络层:数据分组、路由选择
链路层:数据组成可发送、接收的帧
物理层:传输物理信号、接口。信号形式、速率
2.1.2 TCP\IP协议族的体系结构
一共是四层:应用层、传输层、网络层、链路层(网络接口层和物理)
- 应用层:Telnet、FTP、HTTP、DNS、SMTP等
- 传输层:TCP和UDP
- 网络层:IP、ICMP和IGMP
- 网络接口层和物理层:以太网、PPP、令牌环网、无线局域网等底层传输标准、涵盖链路与物理硬件等
2.1.3、两者对应关系
| OSI | 功能 | TCP/IP协议族 |
|---|---|---|
| 应用层 | 文件传输,电子邮件,文件服务,虚拟终端 | TFTP、HTTP、SNMP、FTP、SMTP、DNS、Telnet |
| 表示层 | 数据格式化、代码转换、数据加密 | 没有协议 |
| 会话层 | 建立、管理、断开通信会话,同步控制 | 没有协议 |
| 传输层 | 提供端对端的接口 | TCP,UDP |
| 网络层 | 为数据包选择路由 | IP、ICMP、RIP、IGMP |
| 数据链路层 | 传输有地址的帧以及错误检测功能 | SLIP、PPP、ARP |
| 物理层 | 以二进程数据形式在物理媒体上传输数据 | RS232、ISO 物理接口规范 |
2.1.4、TCP\IP协议族中常见的协议
应用层 :
HTTP:超文本传输协议。万维网的数据通信基础
FTP:文件传输协议。是用于在网络上进行文件传输的一套标准协议,使用TCP传输
TFTP:简单文件传输协议。是用于在网络上进行文件传输的一套标准协议,使用UDP传输
SMTP:简单邮件传输协议。一种提供可靠且有效的电子邮件传输的协议
传输层:
TCP:传输控制协议。是一种面向连接的、可靠的、基于字节流的传输层通信协议
UDP:用户数据报协议。是一种无连接、不可靠、快速传输的传输层通信协议
网络层 :
IP:网际互连协议。是指能够在多个不同网络间实现信息传输的协议
ICMP:互联网控制信息协议。用于在IP主机、路由器之间传递控制信息、ping命令使用的协议
IGMP:互联网组管理。是一个组播协议,用于主机和组播路由器之间的通信
链路层 :
ARP:地址解析协议。通过IP地址获取对方mac地址
RARP:逆向地址解析协议。通过mac地址获取ip地址

3、TCP和UDP的区别
- 两者都是传输层的相关协议
- 对于TCP而言(稳定)
1、TCP提供了面向连接的、可靠的数据传输服务
2、传输过程中,能够保障数据无误、数据无丢失、数据无重复、数据无失序
TCP通信中会给每个数据包编上编号,该编号称为序列号
每个序列号都需要应打包应答,如果没有应答,则会将上面的数据包重复传输
3、TCP通信中,数据传输效率较低,耗费资源较多
4、数据收发是不同步的
为了提高传输效率,tcp通信中会将多个较小的,发送时间间隔较短的数据包,沾成一个数据包进行发
送,该现象称为沾包现象
5、TCP通信使用场景:对于传输质量要求较高的以及传输量较大的数据通信,在需要可靠传输信息的场合,一
般使用TCP通信
例如:账户和密码登录注册、大型文件的下载

- 对于UDP通信(快速)
1、提供面向无连接、不保证数据可靠传输、尽最大努力传输的协议
2、数据传输过程中,可能会出现数据丢失、重复、失序、乱序等现象
3、数据传输效率较高、实时性高
4、限制每次传输的数据大小,多出部分会直接被忽略删除
5、数据的收发是同步的,不会沾包
6、使用场景:发送小尺寸的,在收到数据后给出应答比较困难的情况下,采用udp通信
例如:广播、组播、通信软件的音视频传输
4、字节序的概念
字节序:计算机在存储多字节整数 时,根据主机的CPU处理结构不同,我们将主机分成大端存储 和小端存储。
- 大端存储:内存地址的低位存储的是数据的高位
- 小端存储:内存地址的低位存储的是数据的低位
-
网络字节序:规定都是大端存储的。无论发送端是大端存储还是小端存储,在传输多字节整数时,一律先转换为网络字节序。经由网络传输后,到达目的主机后,在转换为主机字节序即可
-
网络字节序和主机字节序之间相互转换的函数
c主机:host 网络:network 转换:to #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字节整数的网络字节序转换为主机字节序,参 数是网络字节序,返回值是主机字节序 -
何时使用网络字节序转换函数:在进行多字节整数网络传输时,需要使用字节序转换函数;在进行单字节整数传输时,不需要使用;在网络中传输字符串时,也不需要使用
5、ip地址
- ip地址是主机在网络中的唯一标识,由两部分组成,分别是网络号和主机号。网络号:确定计算机所从属的网络。主机号:标识该设备在该网络中的一个编号
- 作用:在网络传输过程中,给网络传输载体添加必要的信息,指定源ip地址和目的ip地址,以便于找到目的主机
- IP地址的分类
1、IPv4:是使用4字节的无符号整数表示的一个IP地址,取值范围【0,2^32-1】
2、IPv6:是使用16字节无符号整数表示的一个ip地址,取值范围 【0, 2^128-1】
3、IPv6是不兼容IPv4的 - 地址划分:一共分为5类网络,分别是A类、B类、C类、D类、E类网络

| 网络类型 | 取值范围 | 网络号个数 | 主机号个数 | 用途 |
|---|---|---|---|---|
| A类 | 1.0.0.0---126.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 | 组播IP | ||
| E类 | 240.0.0.0---255.255.255.255 | 保留,科研实验、特殊预留 |
5.2、特殊的IP地址
1、网络号 + 全为0的主机号:表示该网络,不分配给任何主机使用,例如:192.168.10.0
2、网络号 + 全为1的主机号:表示当前网络的广播地址,也不分配给任何主机使用,例如:192.168.10.255
3、网络号 + 主机号为1:默认表示网关,当然可以自己制定网关ip
4、127.0.0.0:本地环回ip,当没有网络时,用于测试当前主机的ip
5、0.0.0.0:表示当前局域网中的任意一个主机号
6、255.255.255.255:一般表示广播地址
5.3、点分十进制
点分十进制数据向4字节无符号整数转换的相关函数
c
地址:address
网络:network
转换:to
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
in_addr_t inet_addr(const char *cp);//将点分十进制的ip地址转换为4字节无符号整数的网络字节序,参数时点分十进制数据,返回值时4字节无符号整数
char *inet_ntoa(struct in_addr in);//将4字节无符号整数的网络字节序,转换为点分十进制的字符串
6、端口号
- 作用:为了区分同一个主机之间的每个进程的,使用端口号来进行标识;概念:端口是是一个 2 字节的无符号整数表示的数字,取值范围 【0, 65535】
- 为什么不使用进程号标识,而使用端口号:因为进程号是进程的唯一标识,当同一个应用程序,关闭再打开后,并不是同一个进程号了,但是是同一个应用程序,所以,端口号标识的是我们的应用程序,当一个应用程序关闭再打开后,端口号不变
- 引入端口号后,网络通信:ip 地址 + 端口号(ip地址可以在网络中,唯一确定对端的主机地址,通过端口号能够找到该主机中指定的对端应用程序)
- 端口号的分类:
1、0~1023 :众所周知的 "VIP"端口号:被特殊的应用程序已经占用了的
2、1024 ~ 49151:用户可分配的端口号
3、49152~65535:动态分配或系统自动分配的端口号