csapp网络编程初学笔记
客户端-服务器编程模型
每个网络应用都是基于客户端-服务器模型,服务器管理某种资源,并且通过操作来为它的客户提供某种服务
客户端-服务器模型中的基本操作是transaction,由以下四步组成:
1.当一个客户端需要服务时,它向服务器发送一个请求。
2.服务器接收到请求后,解释它,并以适当的方式操作它的资源。
3.服务器给客户端发送一个响应,并等待下一个请求。
4.客户端接收响应并处理响应。
网络
客户端和服务器通常运行在不同的主机上,并借通过计算机网络的硬件和软件资源来通信。网络是个复杂的系统。
从程序员的角度来看的一个可工作的思考模型:
对于一个主机而言,网络只是又一种I/O设备,作为数据源和数据接收方。
网络物理层次:
1.以太网段(Ethernet segment):由电缆,集线器,不同主机构成。
2.桥接以太网(bridged Ethernet):较大的局域网,由多个以太网段和网桥构成。
3.互联网络(internet):由多个局域网和路由器构成。
协议
协议是运行在每台主机和路由器上的一种软件,这种软件实现了一种协议,这种协议控制主机和路由器如何协同工作来实现数据传输。互联网至关重要的特性是,它能由采用完全不同的和不兼容技术的各种局域网和广域网组成,所以才需要协议来实现某台源主机跨过所有这些不兼容的网络发送数据到另一台目的主机。为此这种协议必须提供两种基本能力:
1.命名机制.不同的局域网技术有不同的和不兼容的方式来为主机分配地址。互联网协议通过命名一种一致的主机格式来消除这些差异。每台主机会被分配至少一个这种互联网络地址,这个地址唯一标识这台主机。
2.传送机制.在电缆上编码位和将这些位封装为帧方面,不同的网络技术有不同和不兼容的方式.互联网协议通
过定义一种把数据位困扎成不连续的包的统一方式,从而消除了这些差异.
全球IP因特网
每台因特网主机都实现运行TCP/IP协议的软件,因特网的客户端和服务器端混合使用套接字接口函数和UNIX I/O函数来进行通信
从程序员角度,可以把因特网看作是一个世界范围的主机集合,满足以下特性:
1.主机集合被映射位一组32位的IP地址.
2.这组IP地址被映射为一组称为因特网域名的标识符
3.因特网主机上的进程能够通过连接和其他因特网主机上的进程通信.
IP地址
一个IP地址就是一个无符号32位整数.网络程序将IP地址存放在如下IP地址结构中
/*Internet address structure*/
struct in_addr{
unsigned int s_addr;//network byte order(big-endian)
};
因特网域名
因特网客户端和服务器互相通信使用的是IP地址,然而对于人们而言,大整数是很难记住的,所以因特网也定义了一组更加人性化的域名,以及将域名映射到IP地址的机制.这个映射就是通过分布世界范围内的数据库(DNS)来维护的.所以每条主机条目就是一个域名和IP地址的等价类.
/*DNS host entry structure*/
struct hostent{
char *h_name; //official domain name of host
char **h_aliases; //null-terminated array of domain names
int h_addrtype; //host address type
int h_length; //length of an address in bytes
char **h_addr_list; //null-terminated array of in_addr structs
};
因特网程序通过调用gethostbyname和gethostbyaddr函数,从DNS数据库中检索任意主机条目.
#include<netdb.h>
struct hostent *gethostbyname(const char *name);
/*返回:若成功则为非NULL指针,若出错则为NULL指针,同时设置h_erron*/
struct hostent *gethostbyaddr(const char *addr,int len,0);
/*返回:若成功则为非NULL指针,若出错则为NULL指针,同时设置h_erron*/
因特网连接
因特网客户端和服务器通过在连接上发送和接收字节流来通信.从连接一对进程的意义来讲,连接是点对点的,从数据可以同时双向流动来讲,他是全双工的.
一个套接字就是连接的一个端点,每个套接字都有相应的套接字地址,是由一个英特网地址和一个16位整数端口组成.用"地址:端口"来表示,当客户端发起一个连接请求时,客户端套接字地址中的端口是由内核自动分配,称为临时端口,然而服务器套接字端口通常是某个知名的端口,如web服务器通常是80端口.
一个连接是由它两端的套接字地址唯一确定的,这对套接字地址叫做套接字对,由下列元组来表示:
(cliaddr:cliport,servaddr:servport)