网络编程 csapp
客户端 服务器 是进程
网络 IO设备 数据源与数据接收方
数据 适配器 IO 内存总线 内存
协议:一致性
命名
传送数据(打包)
语义抽象,封装接口:套接字
IP:IP地址 区别主机
UDP TCP :端口号区别进程
DNS域名系统
域名:IP地址
localhost:127.0.0.1
通信:在连接上发送接收 字节流
对进程而言,连接是 点对点,全双工的
套接字:连接的端点
地址:端口
客户端:端口由内核自动分配,临时端口
服务器:知名端口
套接字对:确定一个连接(双向)
套接字接口:一组函数
+Unix IO
=网络应用
linux内核角度
套接字是通信端点,有相应描述符的打开文件
connect,bind,accept函数要求参数:指针:指向套接字地址结构
socket函数创建套接字描述符
返回的clientfd描述符是部分打开的,不能读写
传参:地址,协议类型?
connect函数建立连接
成功后描述符可以读写
bind,listen,accept
服务器函数,用于连接客户端
客户端:发起请求的主动实体
服务器端:等待请求的被动实体
内核默认socket创建主动实体(客户端)
listen指明为被动(服务器)
将套接字从主动套接字转化为监听套接字(一次)
accept等待客户端请求
返回已连接套接字(多次)
getaddrinfo
getnameinfo
open_clientfd
open_listenfd
web服务器:HTTP协议
web内容:MINE类型的字节序列
提供内容的方式:
取磁盘文件:静态
运行可执行文件:动态
URL:通用资源定位符
文件名?参数&参数
客户端:前缀访问服务器
服务器:后缀定位文件
HTTP请求:
请求行
请求报头,结束标记(空行)
请求行:
method URI vers
URI:URL后缀
请求报头:额外信息
header-name:header-data
HTTP响应
响应行
version status-code status-message
响应报头
响应主体
CGI:环境变量
客户端参数
CHI程序:标准输出重定向到套接字
当文件映射到内存,不再需要其描述符了