Linux网络编程

网络编程

了解网络名词

IP地址:在网络中唯一标识的一台主机

port端口:在一台主机上标识一个进程

协议:通信双方的约定

网络协议:网络通信环境中数据的约定格式

通信协议标准:网络互联的前提

协议分层

在以往的了解知道协议具有多层,而分层就是为了协议分装,为了更好的使用。

对服务,接口,协议进行明确的划分;形成标准实现起来就容易了

OSI七层模型

物理层,数据链路层,网络层,传输层,会话层,表示层,应用层

这是基础网络中的七层模型,这是一种理想的模型状态,在现代,大佬们将其划分为TCP/IP五层模型。将会话层,表示层,应用层全都规划到应用层。

Linux网络编程

TCP/IP五层模型

物理层,链路层,网络层,传输层,应用层

  • 物理层:负责光电信号的传输;比如以太网协议
  • 链路层:负责相邻设备之间的数据帧传输;比如Ethernet以太网协议;
  • 网络层:负责地址管理和路由选择;IP协议,典型设备(路由器:负责路由选择,选择数据发送到哪里去)
  • 传输层:负责端与端之间的数据传输;TCP协议,UDP协议
  • 应用层:负责应用程序之间的数据沟通(一般交由程序员来写);HTTP协议,FTP,SMTP,DNS,HTML

Linux网络编程

图中是我自己的理解,只能算一个初步的了解,不能算标准。

不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报 (datagram),在链路层叫做帧(frame).

应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装 (Encapsulation).

数据封装的过程如下图:

Linux网络编程

网络编程套接字

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.****.net/gui951753/article/details/79210535

port端口

端口的类型是(uint16,065535;01024不推荐使用,一般多为系统占用端口)

端口是再网络上唯一标识一个进程

网络程序分为了客户端和服务端,主动发起的一方是客户端,被动再指定位置接收的一方是服务端,而且服务端被动的接收地址必须是固定不变的。

一个端口只能被一个进程占用;一个进程可以使用多个端口

在发送数据的过程中,每条数据都一定包含了五元组:源IP,源端口,目的IP,目的端口,协议

网络字节序

字节序:cpu在内存中对数据存取的顺序

在以往的学习中,我们了解过大端与小端这两种字节序。

简单回忆一下。小端是低地址放低位,高地址放高位;大端是低地址放高位,高地址放低位

在网络中,存在主机字节序,它是当前计算机的字节序,大小端这取决于cpu架构

因此为了传输数据的我们要保证两端主机字节序相同,如果不同,那么就会造成数据二义性。所以保证一个程序的可移植性,通信双方必须使用网络字节序进行通信。在网络通信中,数据的字节序转换主要是针对数据存储大于一个字节类型的数据

网络字节序,一般使用大端字节序。通过联合体判断。

传输层协议(简单了解)

**TCP:**传输控制协议,面向连接,可靠传输,面向字节流

面向连接:通信之前先建立连接,确保双方在线。

可靠传输:在网络正常的情况下,数据不会丢失

面向字节流服务:传输灵活,但是存在tcp粘包问题,没有明显的数据约定

使用场景多为:传输文件,保证数据安全,对数据安全的要求较高

**UDP:**用户数据协议,无连接,不可靠,面向数据报

面向数据报:每条数据有长度标识,数据有明显的间隔,带有报头的整条发/收。传输不灵活。注意!!!!不存在粘包问题

使用场景多为:多数据实时要求非常高的,比如看视频。