网络编程
- 认识到客户端和服务器是进程不是机器或者主机是很重要的。
- 客户端和服务器运行在不同的主机上,通过计算机网络的硬件和软件资源来通信。
- 对于一个主机而言,网络只是一种I/O设备作为数据源和数据接收方。
- 一个插到I/O总线的扩展槽的适配器提供了网络的物理接口
- 物理上网络是一个按照地理远近组成的层次系统。
- ==集线器==不加分辨得从一个端口上收到的每个位==复制==到其他的所有端口上。
- 每个主机适配器都能够看到这个帧,但是只有目的主机能够实际读取他。
- 网桥比集线器更加充分的利用电缆带宽。
在层次更高的级别当中多个不兼容的局域网可以通过路由连接起来。
每台因特网主机都运行实现TCP/IP协议
- 因特网的客户端和服务器混合使用==套接字接口函数和UNIX/I/O函数==来进行通信
- 套接字函数是作为陷入内核的系统调用来实现并调用各种内核模式的TCP/IP函数
IP地址
struct in_addr {
unsigned int s_addr;
}
- 因特网主机可以有不同的主机字节顺序 TCP/IP为任意整数数据项定义了统一的网络字节顺序(大端字节顺序)。即使主机字节顺序是小端法。UNIX提供了网络和主机字节顺序之间的转换。
- hostname -i 在Linux来确定自己主机的点分十进制地址
- ==一个套接字是连接的一个端点==,每个套接字都有相应的==套接字地址==。由一个因特网地址和一个16位的整数端口组成。==地址:端口==来表示。
- 当客户端发起的一个连接请求时,客户端套接字地址中的端口是由内核自动分配的称为临时端口。
- 套接字服务器地址中的端口是某个知名端口号。
- UNIX机器上文件/etc/services包含一张这台机器提供的服务以及知名端口号
- 一个连接是由他两端的套接字地址唯一确定的这对套接字地址叫做套接字对。
- 套接字接口是一组函数
套接字是加州大学伯克利分校提出的,适用于任何底层的协议,第一个实现就是针对TCP/IP协议
从UNIX内核来看,套接字就是通信的一个端点,从程序来看是一个有相应描述符的打开文件。
bind listen accept 被服务器用来和客户端建立连接
==监听描述符和已连接描述符==:
- 监听描述符是作为客户端连接请求的一个端点 只被创建一次 存在服务器的整个生命周期
- 已连接描述符是客户端和服务器之间已经建立起来的连接一个端点,服务器每次接受请求的时候都会创建一次。
区分两者使得我们可以建立并发的服务器。
- 显示的关闭已经打开的任何描述符是一个良好的编程习惯
- ==连接当中的EOF==:end of file
EOF是由内核检测到的一种条件。应用程序在接收到一个有read函数返回的0码时就会发现EOF条件。对于磁盘文件档文件位置超出文件长度的时候,会发生EOF。对于因特网连接当一个进程关闭连接他的那一端时会发生EOF。
web服务器
- 利用的是一种基于文本的应用级协议 ==HTTP协议 超文本传输协议==
- web内容可以==使用HTML语言编写== : 超文本标记语言。他告诉浏览器如何显示这页的各种文本和图形对象。
HTML的真正强大之处在于一个网页可以==包含指针==(超链接)这些指针可以指向任何因特网主机上的内容。
告诉浏览器高亮显示文本百度,并且创建一个超链接指向百度首页。
- 对于web服务器和客户端而言 内容是一个MIME类型的字节序列。
web服务器以两种不同的方式向客户端提供内容:
- 取一个磁盘文件,将其内容返回给客户端。磁盘文件称为静态内容,过程称为服务静态内容。
- 运行一个可执行文件,并将它的输出返回给客户端。运行时可执行文件产生的输出称为动态内容。运行程序并返回他的输出给客户端的过程称为服务动态内容。
每条内容都是服务器管理的扣个文件相关联。这些文件每一个都有一个唯一的名字叫做URL 通用资源定位符。
- 可执行的URL可以在文件名后包含程序参数 ?字符分隔文件名和参数。每个参数都用&字符分隔开 参数当中不允许出现空格
- 可以使用UNIX的telnet程序来和因特网上的任何Web服务器执行事务。
- HTTP标准要求每个文本行都由一对回车和换行符来结束
服务动态内容
- 一个服务器是如何想客户端提供动态的内容?
- 服务器如何将这些参数传递给他所创建的子进程或线程?
- 称为CGI的通用网关接口的实际标准解决这个问题
- HTTP的POST请求当中传递的参数是在请求主体当中而不是URI当中传递的。
- CGI程序称为CGI脚本
- 一个CGI程序将他的动态内容发送到标准输出。在加载并允许CGI程序之前将标准输出重定向到和客户端关联的已连接描述符。任何CGI程序写到标准输出的东西都会直接到达客户端。
- 对动态内容的请求是通过在服务器上一个子进程的上下文中运行一个程序将他的输出返回给客户端来服务的。