网络编程基本概念
1. 进程间通信机制 (7种)
- 无名管道:只能用于具有亲缘关系的进程间通信
- 有名管道:会创建一个本地的管道文件
- 信号通信:唯一的异步通信机制
- 消息队列:可以保存数据,并且可以通过消息类型获取数据
- 共享内存:实时数据会使用共享内存保存和读取
- 信号灯集:解决同步问题
- 套接字通信:最大的特点是可以实现不同主机之间的进程通信
2.1 OSI开放系统互联模型
七层结构
- 应用层:面向用户的应用程序,app
- 表示层:数据加密、解密操作
- 会话层:将数据所在主机的逻辑名字和物理名字之间建立联系
- 传输层:负责数据具体传输的机制
- 网络层:处理如何将数据发给目的主机,路由的选择
- 链路层:将前面所有的数据组成一个数据包,称之为一帧数据
- 物理层:选择数据发送的物理媒介
注意:OSI的七层结构是绝对不能互换的,可以从上到下说,也可以从下到上说,但是顺序绝对不能颠倒
2.2 TCP/IP协议族
四层
虽然TCP/IP协议族只有四层结构,但是却包含了OSI七层的所有功能
2.3 OSI模型与TCP/IP协议族对比
2.4 常用协议
-
应用层 ① HTTP(Hypertext Transfer Protocol) 超文本传输协议 --> 万维网的数据通信的基础 ② FTP(File Transfer Protocol) 文件传输协议 --> 是用于在网络上进行文件传输的一套标准协议,使用 TCP 传输 ③ TFTP(Trivial File Transfer Protocol) 简单文件传输协议 --> 是用于在网络上进行文件传输的一套标准协议,使用 UDP 传输 ④ SMTP(Simple Mail Transfer Protocol) 简单邮件传输协议 --> 一种提供可靠且有效的电子邮件传输的协议 -
传输层 ① TCP(Transport Control Protocol) 传输控制协议 --> 是一种面向连接的、可靠的、基于字节流的传输层通信协议 ② UDP(User Datagram Protocol) 用户数据报协议 --> 是一种无连接、不可靠、快速传输的传输层通信协议 -
网络层 ① IP(Internetworking Protocol) 网际互连协议 --> 是指能够在多个不同网络间实现信息传输的协议 ② ICMP(Internet Control Message Protocol) 互联网控制信息协议 --> 用于在IP主机、路由器之间传递控制消息 ③ IGMP(Internet Group Management Protocol) 互联网组管理 --> 是一个组播协议,用于主机和组播路由器之间通信 -
数据接口与物理层 ①ARP(Address Resolution Protocol) 地址解析协议 --> 通过IP地址获取对方mac地址 ② RARP(Reverse Address Resolution Protocol) 逆向地址解析协议 --> 通过mac地址获取对方ip地址
注意 :每层协议之间是有一定联系的,上层的一些协议必须要下层提供指定协议才能够使用,协议之间不能够乱组包
2.5 数据封装和解包
一个数据包的大小不止应用层数据的大小,还要包含各个层次的协议头的大小
2.7 TCP与UDP协议
2.7.1 TCP (即传输控制协议)
TCP 是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP协议有回传机制,如果数据传输有误,会重新传输
适用情况: ① 适合于对传输质量要求较高,以及传输大量数据的通信。 ② 在需要可靠数据传输的场合,通常使用TCP协议 如 MSN/QQ等即时通讯软件的用户登录账户管理相关的功能通常采用TCP协议
2.7.2 UDP 用户数据报传输协议
UDP是一种无连接、不可靠、快速传输的传输层通信协议。在数据发送前,因为不需要进行连接,且不会确认数据发送是否出现错误,所以可以进行高效率的数据传输。
适用情况: ① 发送小尺寸数据(如对DNS服务器进行IP地址查询时) ② 在接收到数据,给出应答较困难的网络中使用UDP。(如:无线网络) ③ 适合于广播/组播式通信中。 ④ MSN/QQ/Skype等即时通讯软件的点对点文本通讯以及音视频通讯通常采用UDP协议 ⑤ 流媒体、VOD、VoIP、IPTV等网络多媒体服务中通常采用UDP方式进行实时数据传输
2.7.3 TCP与UDP二者异同点
- 共同点 :同为传输层协议
- 不同点:
TCP:有连接,可靠 UDP:无连接,不保证可靠
3. socket、ip、端口号、字节序
- socket --> 提供可通信的场所
- ip地址 --> 确定唯一主机
- 端口号 --> 确定唯一进程
- 字节序 --> 能够看懂数据(大小端存储问题)
3.1 socket 套接字
socket是一个函数接口,会返回文件描述符 socket常用的三种类型:
-
SOCK_STREAM --> 流式套接字 ① 提供一个面向连接、可靠的数据传输服务。 ②可以将数据无差错,无重复的发送且按发送顺序接收 ③内设置流量控制,避免数据流淹没慢的接收方。 ④数据被看作是字节流,无长度限制,用于TCP -
SOCK_DGRAM --> 数据报套接字 ①提供无连接服务 ②数据 以独立数据包的形式被发送,不提供无差错保证,数据 可能丢失或者重复。顺序发送,有可能乱序接收。 ③用于UDP -
SOCK_RAW --> 原始套接字 可以对较低层次协议直接访问,如IP、ICMP。
3.2 IP地址 mac地址
MAC地址在一个局域网内确定唯一一台主机 每个网卡在出厂时,会分配一个编号,这个编号就是mac地址,每个mac地址占6字节 IP地址在网络中确定唯一一台主机
3.2.1 查询IP地址:
Linux:ifconfig windows:ipconfig
3.2.2 ip地址分类
互联网通信协议版本 | 占用位bit | 占用字节数bytes |
---|
IPv4 | 32位 | 4字节 | IPv6 | 128位 | 16字节 |
3.2.3 IPv4地址表示形式
点分十进制:192.168.70.10 ①三个点将地址等分成四个部分,每个部分1个字节,每一部分范围都是0-255 ②开发时,写IPv4地址时,不需要写点,直接写32位地址即可 ③点分十进制IP地址本质是字符串,32位IP地址本质是无符号整型数据
3.2.4 IPv4地址分类
IPv4地址分类根据地址前八位来分
类型 | 前八位范围 | 地址范围 | 私有IP地址范围 | 其他 |
---|
A类 | 0000 0000 – 0111 1111 | 0.x.x.x – 127.x.x.x | 10.0.0.1 – 10.255.255.254 | | B类 | 1000 0000 – 1011 1111 | 128.x.x.x – 191.x.x.x | 172.16.0.1 – 172.31.255.254 | | C类 | 1100 0000 – 1101 1111 | 192.x.x.x – 223.x.x.x | 192.168.0.1 – 192.168.255.254 | | D类 | 1110 0000 – 1110 1111 | 224.x.x.x – 239.x.x.x | | 都是组播地址 | E类 | 1111 0000 – 1111 1111 | 240.x.x.x – 255.x.x.x | | 都属于保留测试 |
127.x.x.x 属于每一台主机的本地地址,主要用于一台主机的多个进程通过套接字通信可以使用这个ip地址 局域网地址:任意一个ip地址都可以通过路由器下分局域网ip地址,为了解决ipv4地址不够用的问题
3.2.5 IPv4的C类地址分析
IPv4的C类地址前24位为 网络号,后8位为 主机号。 例: 192.168.50.x
地址 | 表示 |
---|
192.168.50.0 | 表示网络号,或者网段 | 192.168.50.255 | 表示当前网段下的广播地址 | 192.168.50.1 | 表示网关,是路由器的IP地址 |
理论上,一个网段可以分配 256 个IP地址,但实际只能连接 254 个
3.2.6 IPv4的子网掩码
子网掩码:用于判断一个网段下能够连接的主机数量
子网掩码也是32位,每一位与ipv4的地址对应,子网掩码一般是由连续个1和连续个0组成。 连续个1对应的ip地址的对应位置称之为网络号,连续个0对应的ip地址的对应位置称之为主机号,所以理论上有多少个0就可以判断连接的主机数
类别 | 子网掩码 |
---|
A类 | 255.0.0.0 | B类 | 255.255.0.0 | A类 | 255.255.255.0 |
练习题:192.168.50 网段下的子网掩码是255.255.255.128 , 请问实际连接的主机数是 2^7 - 2 = 126 , 范围是 192.168.50.129 - 192.168.50.254
3.2.7 端口号
端口号是人为设置的用来区分一个操作系统中进程的编号,一个端口号标识一台主机的唯一一个进程 端口号一般由IANA (Internet Assigned Numbers Authority) 管理 众所周知端口: 1 – 1023 ( 1 – 255 为众所周知端口,256 – 1023 端口通常由 UNIX系统占用 ) 已登记端口:1024 – 49151 动态或私有端口:49152 – 65535
可以使用 vi /etc/services 查看已经被占用的端口号 一般情况下,6666、7777、8888、9999、10000都可以使用
3.2.8 字节序
不同类型CPU的主机中,内存存储多字节整数序列方式,叫做主机字节序(HBO)
字节序分为:小端序(little-endian)和 大端序(big-endian)
小端序 (little-endian) : 低字节存储低地址 将低字节存储在起始地址,称为小端字节序 intel、AMD等都采用小端序
大端序(big-endian):高字节存储在低地址 将高字节存储在起始地址,称为大段字节序 ARM、Motorola等采用。
举个例子 字节是分配内存的最小单位
int a = 0x12345678
伪地址 | 0x1000 | 0x1001 | 0x1002 | 0x1003 |
---|
小端 | 0x78 | 0x56 | 0x34 | 0x12 | 大端 | 0x12 | 0x34 | 0x56 | 0x78 |
记忆偏方(不准确,莫全信): 我们用的电脑是小机器,用小端存储 小端存储是“小存小”,存储位置跟字节高低位一致
服务端是大机器,用的大端存储 大端存储是“小存大”,存储位置跟字节高低相反
总结 一样的是小端,不一样的是大端 一样的机器一致的字节序 # 不一样的机器不一致的字节序
如果两个主机之间想要通信,那么还需要确定两个主机的字节序是否一样,如果不一样,收发的数据可以会出问题
网络中传输的数据必须按网络字节序,即大端字节序
例如:张三要给李四发送数据,张三就需要将数据从主机字节序转化为网络字节序,李四接收到数据之后,将网络字节序的数据转化为主机字节序,这样就保证数据传输无误
什么样的数据在传输的时候需要考虑字节序? 如果是单个字符或者字符串,是不需要考虑字节序的,因为一个字节一个字节存取时不涉及字节序的转换 如果多个字节作为一个整体,就需要考虑字节序,比如端口号
具体主机字节序与网络字节序之间的转换不需要自己实现,有专门的函数htons 、htonl 、ntohs 、ntohl
|