33.网络基础概念(三)
网络通信的本质
进程是人在系统中的代表,只要把数据交给进程,人就相当于拿到了数据。
数据传输到主机不是目的,而是手段,到达主机内部,在交给主机内的进程,才是目的。
上网,只有两种行为:
1.从远端服务器,获取数据
2.本地数据,上传到远端服务器
进程(内存)-> 网卡 -> 网络(进程和网卡的交互就是IO操作)
网络通信的本质:其实是两个不同主机的进程在进行数据交互
再进一步:网络通信本质是进程间通信(让不同进程看到同一份资源,网络)
端口号(网络层面标识网络进程唯一性)
在系统中,同时会存在非常多的进程,当数据到达目标主机后,怎么转发给目标进程?用端口号标识网络进程的唯一性。
端口号认识:
- 端口号port是传输层协议的内容。
- 端口号是一个2字节16位的整数。
- 端口号用来标识一个进程,告诉操作系统,当前这个数据交给哪一个进程来处理。
端口号 vs pid:
- 不是所有的进程,都要进行网络通信。
- 从技术角度,pid是可行的。但pid是一个系统的概念,如果pid变化了,传输层协议就要跟着变化,端口号设计为了解耦。
IP:标识全球范围内唯一主机
port:标识该主机的唯一网络进程
IP+port = 全网唯一一个进程
网络通信本质:全网唯二的两个进程在进行进程间通信。
socket = IP + port
socket翻译插座,理解:插上插头就能通电。
拓展:一个进程可以对应多个端口号,一个端口号只能对应一个进程。
- 0 - 1023 : 知名端口号, HTTP, FTP, SSH 等这些广为使用的应用层协议, 他们的端口号都是固定的.
- 1024 - 65535 : 操作系统动态分配的端口号. 客户端程序的端口号, 就是由操作系统从这个范围分配的.
传输层的经典代表
TCP ( Transmission Control Protocol 传输控制协议):
- 传输层协议
- 有连接
- 可靠传输
- 面向字节流(数据源源不断传输)
UDP ( User Datagram Protocol 用户数据报协议):
- 传输层协议
- 无连接
- 不可靠传输(丢包不重传)
- 面向数据报(数据是一块一块传输的)
不可靠:要看成是中性词。
可靠和不可靠只是TCP和UDP的特点,没有明显的优劣。可靠意味着做更多工作,更复杂,占用更多资源;不可靠意味着很简单。
网络字节序
内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分, 网络数据流同样有大端小端之分. 那么如何定义网络数据流的地址呢?
网络络数据流的地址规定: 先发出的数据是低地址,后发出的数据是高地址。
回顾大小端(以字节为单位存储,例如数据 0x 12 34 56 78):
- 小端,低权值位存低地址,高权值位存高地址,即 0x 78 56 34 12(地址从左向右依次增大)
- 大端,低权值位存高地址,高权值位存低地址,即 0x 12 34 56 78(地址从左向右依次增大)
TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节。不管这台主机是大端机还是小端机, 都会按照这个TCP/IP规定的网络字节序来发送 / 接收数据。
socket背景与设计
system V --- 本地进程间通信(过时)
POSIX标准 --- 网络通信,进程通信(也能进行本地通信)
网络socket 和 本地socket(本地通信,unix域间通信)
本地通信保存了108字节的路径名:通过打开同一路径下的同一文件,看到同一文件缓冲区(命名管道)
socket会有很多种类,满足不同的应用场景 -> socket设计者只提供一种通信接口
设计上,struct sockaddr是基类,struct sockaddr_in 是网络通信子类,struct sockaddr_un 是本地通信子类,两个子类的前16为地址类型,AF_INET为网络,AF_UNIX为本地。这就实现了一套继承体系,传参时将子类指针强转成基类指针,基类指针指向不同子类就是不同的表现,这就是多态。
socket编程接口
int socket(int domain, int type, int protocol); // 打开网络文件
- domain:AF_INET,表示网络通信
- type:SOCK_DGRAM,用户数据报套接字
- protocol:传0
- 返回值:成功返回文件描述符,失败-1返回,错误码被设置
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); //绑定端口号
- sockfd:socket的返回值,网络文件描述符
- addr:基类指针,传不同的子类指针强转,指向不同的子类(网络或本地等)
- addrlen:传的addr指向对象的大小
- 返回值:成功0返回,失败-1返回,错误码被设置
网络通信结构struct sockaddr_in:
- 第一个成员变量为:宏,替换后实质上 sa_family_t sin_famliy; (sa_family_t 本质是一个无符号短整形,sin_family是通过宏替换+##拼接符号的一个变量名)2字节
作用:标识通信方式- 第二个成员变量:in_port_t sin_port; (in_port_t 本质一个16位无符号整数)2字节
作用:端口号- 第三个成员变量:struct in_addr sin_addr; (struct in_addr 里面只有一个成员变量 in_addr_t类型,in_addr_t是一个32位无符号整数)4字节
作用:IP地址- 最后一个成员变量:8字节填充
192.168.0.123 -> 点分十进制方案的IP地址,只需要4个字节,每个字节取值范围[0, 255]