网络编程模型是一种 客户端-服务器 模型
要注意的是服务器和客户端是进程,而不是通常意义上的机器或者主机之类的东西,一台主机上可以运行多个客户端进程或服务器进程。
对于主机来说,网络可以看成一个IO设备,是数据源和数据接收方。网络上接收的数据可以通过I/O和内存总线,复制到内存中去,同样的数据也可以从内存中复制到网络上。
从物理上来说,网络是一个按照地理远近组成的层次系统。分为局域网,广域网,因特网。
互联网络的至关重要的特性是 他能由完全不同和不兼容的技术的各种局域网,广域网组成。每一台主机和其他的主机都是物理相连的。解决这种跨越不兼容网络传输数据的方法是运行在每台主机和路由器上的协议软件,它消除了不同网络之间的差异。
这种协议必须提供两种基本能力:命名机制和传送机制。基本核心思想就是对数据的封装和解封装。
全球IP因特网是最著名的和最成功的互联网络实现。
每台因特网主机上有运行了TCP/IP协议的软件。然后我们通过套接字接口函数和Unix IO函数来实现通信。
TCP/IP是一个协议族,里面的不同的协议都提供不同的功能。
IP地址是一个32位的无符号的整数。这个32位的无符号整数放在一个叫in_addr的结构体中。
因特网主机中有不同的主机字节序,如果直接传输肯定会在不同的主机上出现因为主句字节序不匹配导致的问题,所以TCP/IP为任意整数数据定义了同一的网络字节序(大端字节序)。在IP结构体中存放的IP地址总是以大端法也就是网络字节序的方式存储的,无论主机的字节序是大端还是小端。
Unix提供了主机字节序和网络字节序之间的转换函数。
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
返回:网络字节序的值
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
返回:主机字节序的值
IP地址有两种形式,一种是直接以32位整形数据形式展现,另一种是以点分十进制的形式表示,点分十进制也是我们常见的形式。我们可以使用 inet_pton 和 inet_ntop 函数来是实现IP地址的点分十进制和整形数据之间的转换。
因特网客户端和服务器之间通信时使用的是IP地址,但是这是很难记住的,所以因特网定义了一组更加人性化的域名,以及一种将域名映射到IP地址的机制,域名是一串用点分割开的单词组成。
因特网定义了域名集合和IP地址集合的映射关系。这个映射通过分布在世界范围内的数据库(DNS域名系统)来维护的。
因特网连接
因特网客户端和服务器通过在链接上发送和接受字节流来通信。
socket函数 connect函数 bind函数 listen函数 accept函数