基本网络知识
- 客户端和服务器
- 客户端和服务器都是进程
- 一台主机可以同时运行多个不同的客户端和服务器,一个客户端和服务器的事务可以运行在不同的主机
- 网络系统层次
- LAN(局域网)
- Ethernet(以太网)
- WAN(广域网)
CMU CSAPP笔记 第十一章
CMU CSAPP笔记 第十一章 - LAN(局域网)
- 数据的传输过程
CMU CSAPP笔记 第十一章
- TCP/IP协议
- IP
- 基本的命名方法和递送机制
- IPv4和IPv6
- 最初的互联网协议使用32位地址,称位IPv4,而IPv6有128位地址
- IP地址通常以一种点分十进制来表示
- 128.2.194.242就是地址0x8002c2f2
- UDP
- 不可靠数据报协议
- 使得包可以在进程间而不是主机间传递
- TCP
- 提供进程间可靠的双向链接
- IP
- 域名
- 从后往前解析
- 通过一个叫做DNS的分布式数据库来维护
- 将IP地址与域名映射
- 一个IP地址可以映射到多个域名,一个域名也可以映射到多个IP地址
- 每个主机都有本地域名localhost
- 通过Linux下的nslookup命令可以查看域名对应的IP地址
Socekt
- socket(套字节)
- 套字节地址:IP地址:端口
- 例如199.16.156.198:80
- 端口分为临时端口和知名端口
- 客服端一般为临时端口,服务器一般为知名端口,有相应的服务名
- WEB服务器端口通常为80(http),电子邮件端口为25(smtp)
- 端口为16bit整数
- 套字节地址:IP地址:端口
- socket接口
- socket从Linux程序角度来看就是一个file descriptor
- 地址结构
CMU CSAPP笔记 第十一章
- 服务器和客户端的连接过程
- 服务器和客户端都调用socket函数创建文件描述符
- 服务器调用bind函数准备连接
- 由于默认socket描述符用于客户端,服务器调用listen函数将其转变为监听描述符,这个描述符服务器自开机运行只创建一次
- 最后调用accept函数等待服务器请求到达,返回已连接描述符,这个描述符每当一个服务器和客服端连接就创建一个
- 区分监听和已连接的目的是创建并发服务器,同时处理多个客户端
- 同时客户端(用户)调用connect函数准备连接,打开clientfd描述符
- 当客户端断开后,将会向服务器发送EOF结束符,服务器收到后关闭
- EOF实质上不是一个字符,而是一个内核检测的条件
- listen函数返回的监听描述符和accept返回的已连接描述符是不同的
- 前者在服务器开始运行的整个周期内只有一个,后者每和一个客户端连接就产生一个
- 这样是为了一个服务器可以和多个客户端连接,从而实现并发服务器
- 如图, 可以用open_clientfd和open_listenfd函数封装这些函数
- getaddrinfo函数
- 可以编写独立于特定版本的IP协议的网络程序
- 将主机名,主机地址,服务名和端口号转换为套字节地址结构
WEB服务器
- web服务器向客户端提供的内容
- 每条服务器返回的内容都和他管理的某个文件相关联,这些文件都有一个唯一的名字URL
- 例如: http://www.google.com:80/index.html
- 客服端使用到端口前的部分(http://www.google.com:80),服务器使用端口后的部分(/index.html)
- 默认端口为80
- 端口后不加后缀默认为补全缺失的 ‘/’ 并取出网站的主页
- 静态内容
- 读取服务器上的磁盘文件并返回给客户端
- 例如 http://www.w3.org/Protocols/rfc2616/rfc2616.html
- 动态内容
- 运行一个可执行文件并将输出返回给客户端
- 例如 http://add.com/cgi-bin/adder?15213&18213
- 运行一个可执行文件并将输出返回给客户端
- 每条服务器返回的内容都和他管理的某个文件相关联,这些文件都有一个唯一的名字URL
HTTP事务
- HTTP请求
- 首先要连接服务器和客户端
- 格式:method URI version
- method一般为 GET
- URI为URL端口后面的部分
- version为HTTP版本,一般为HTTP/1.0或HTTP\1.1
- HTTP响应的常见状态码
- 传递动态内容
- ?分割文件名和参数
- 每个参数用 & 隔开
- 举例:
GET /adder?1500&213 HTTP/1.1