网络编程
了解网络名词
IP地址:在网络中唯一标识的一台主机
port端口:在一台主机上标识一个进程
协议:通信双方的约定
网络协议:网络通信环境中数据的约定格式
通信协议标准:网络互联的前提
协议分层
在以往的了解知道协议具有多层,而分层就是为了协议分装,为了更好的使用。
对服务,接口,协议进行明确的划分;形成标准实现起来就容易了
OSI七层模型
物理层,数据链路层,网络层,传输层,会话层,表示层,应用层
这是基础网络中的七层模型,这是一种理想的模型状态,在现代,大佬们将其划分为TCP/IP五层模型。将会话层,表示层,应用层全都规划到应用层。
TCP/IP五层模型
物理层,链路层,网络层,传输层,应用层
- 物理层:负责光电信号的传输;比如以太网协议
- 链路层:负责相邻设备之间的数据帧传输;比如Ethernet以太网协议;
- 网络层:负责地址管理和路由选择;IP协议,典型设备(路由器:负责路由选择,选择数据发送到哪里去)
- 传输层:负责端与端之间的数据传输;TCP协议,UDP协议
- 应用层:负责应用程序之间的数据沟通(一般交由程序员来写);HTTP协议,FTP,SMTP,DNS,HTML
图中是我自己的理解,只能算一个初步的了解,不能算标准。
不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报 (datagram),在链路层叫做帧(frame).
应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装 (Encapsulation).
数据封装的过程如下图:
网络编程套接字
IP地址
IP是在网络上唯一标识一个主机
IPV4(uint32_t):对于IPV4来说,IP地址是一个4字节,32位的整数
通常使用“点分十进制”的字符串标识IP地址,例如:192.168.0.1;用点分割的每一个数字表示一个字节,范围是0-255。
IPV6(uchar ip[16]):IPV6目前还没有完全的被使用,可以先了解一下。它的地址长度128位,是IPV4地址长度的4倍。于是IPV4点分十进制不再适用,采用十六进制表示。
DHCP(Dynamic Host Configuration Protocol):动态主机配置协议是一个局域网的网络协议。DHCP服务可以自动给局域网中的主机自动分配一个IP地址。
NAT技术:因为ipv4的IP不够用,而发明的技术,实现地址转换,多人使用同一地址上网。但要区分公网IP和私网IP。
推荐一篇博客,什么是公网什么是私网:https://blog.csdn.net/gui951753/article/details/79210535
port端口
端口的类型是(uint16,065535;01024不推荐使用,一般多为系统占用端口)
端口是再网络上唯一标识一个进程
网络程序分为了客户端和服务端,主动发起的一方是客户端,被动再指定位置接收的一方是服务端,而且服务端被动的接收地址必须是固定不变的。
一个端口只能被一个进程占用;一个进程可以使用多个端口
在发送数据的过程中,每条数据都一定包含了五元组:源IP,源端口,目的IP,目的端口,协议
网络字节序
字节序:cpu在内存中对数据存取的顺序
在以往的学习中,我们了解过大端与小端这两种字节序。
简单回忆一下。小端是低地址放低位,高地址放高位;大端是低地址放高位,高地址放低位
在网络中,存在主机字节序,它是当前计算机的字节序,大小端这取决于cpu架构
因此为了传输数据的我们要保证两端主机字节序相同,如果不同,那么就会造成数据二义性。所以保证一个程序的可移植性,通信双方必须使用网络字节序进行通信。在网络通信中,数据的字节序转换主要是针对数据存储大于一个字节类型的数据
网络字节序,一般使用大端字节序。通过联合体判断。
传输层协议(简单了解)
**TCP:**传输控制协议,面向连接,可靠传输,面向字节流
面向连接:通信之前先建立连接,确保双方在线。
可靠传输:在网络正常的情况下,数据不会丢失
面向字节流服务:传输灵活,但是存在tcp粘包问题,没有明显的数据约定
使用场景多为:传输文件,保证数据安全,对数据安全的要求较高
**UDP:**用户数据协议,无连接,不可靠,面向数据报
面向数据报:每条数据有长度标识,数据有明显的间隔,带有报头的整条发/收。传输不灵活。注意!!!!不存在粘包问题
使用场景多为:多数据实时要求非常高的,比如看视频。