参考:《THHP权威指南》 by David Gourley,Brian Totty
几乎所有的THHP通信都是由TCP/IP承载的,TCP/IP是全球计算机及网络设备躲在使用的一种常用的分组交换网络分层协议集。
TCP的 数据是通过名为IP分组的小数据块来发送。HTTP要传送一条报文时,会以流的形式将报文数据的内容通过一条打开的TCP连接按序传输。TCP收到数据流之后,会将数据流砍成被称作段的小数据块,并将段封装在IP分组中,通过因特网进行传输。
每个TCP段都是由IP分组承载,从一个IP地址发送到另一个IP地址。IP首部包含了源和目的IP地址、长度和其他一些标记。TCP段的首部包含了TCP段口号、TCP控制标记,以及用于数据排序和完整性检查的一些数字值。每个IP地址分组中包括:
1)一个IP分组首部 2)一个TCP段首部 3)一个TCP数据块
在任意时刻计算机都可以有几条TCP连接处于打开状态。TCP是通过端口号来保持所有这些连接持续不断地运行。
TCP连接通过4个值来识别 : 源IP地址,源端口号,目的IP地址,目的端口号。这四个值唯一地定义了一条连接。
操作系统提供了一些操作器TCP连接的工具,这个套接字API向HTTP程序员隐藏了TCP和IP的所有细节。套接字API允许用户创建TCP的端点数据结构,将这些端点与远程服务器的TCP端点进行连接,并对数据流进行读写。TCP API隐藏了所有底层网络协议的握手细节,以及TCP数据流于IP分组之间的分段和重装细节。
常见套接字接口函数
socket(<parameters>) 创建一个新的、未命名、未关联的套接字
bind(s,<local IP : port>) 向套接字赋予一个本地端口号和接口
connect(s,<remote IP:port>) 创建一个连接本地套接字与远程主机及端口的连接
listen(s,...) 标识一个本地套接字,使其可以合法接受连接
accept(s) 等待某人建立一条道本地端口的连接
read(s,buffer,n) 尝试从套接字向缓冲区读取n个字节
write(s,buffer,n) 尝试从缓冲区中向套接字写入n个字节
close(s) 完全关闭TCP连接
shutdown(s,<side>) 只关闭TCP连接的输入或输出端
getsockopt(s,....) 读取某个内部套接字配置选项的值
setsockopt(s,....) 修改某个内部套接字配置选项的值