天天看点

CMU CSAPP笔记 第十一章

基本网络知识

  • 客户端和服务器
    • 客户端和服务器都是进程
    • 一台主机可以同时运行多个不同的客户端和服务器,一个客户端和服务器的事务可以运行在不同的主机
  • 网络系统层次
    • LAN(局域网)
      • Ethernet(以太网)
    • WAN(广域网)
      CMU CSAPP笔记 第十一章
    CMU CSAPP笔记 第十一章
  • 数据的传输过程
    CMU CSAPP笔记 第十一章
CMU CSAPP笔记 第十一章
  • TCP/IP协议
    • IP
      • 基本的命名方法和递送机制
      • IPv4和IPv6
        • 最初的互联网协议使用32位地址,称位IPv4,而IPv6有128位地址
      • IP地址通常以一种点分十进制来表示
        • 128.2.194.242就是地址0x8002c2f2
    • UDP
      • 不可靠数据报协议
      • 使得包可以在进程间而不是主机间传递
    • TCP
      • 提供进程间可靠的双向链接
  • 域名
    • 从后往前解析
    • 通过一个叫做DNS的分布式数据库来维护
    • 将IP地址与域名映射
      • 一个IP地址可以映射到多个域名,一个域名也可以映射到多个IP地址
      • 每个主机都有本地域名localhost
      • 通过Linux下的nslookup命令可以查看域名对应的IP地址
CMU CSAPP笔记 第十一章

Socekt

  • socket(套字节)
    • 套字节地址:IP地址:端口
      • 例如199.16.156.198:80
    • 端口分为临时端口和知名端口
      • 客服端一般为临时端口,服务器一般为知名端口,有相应的服务名
      • WEB服务器端口通常为80(http),电子邮件端口为25(smtp)
      • 端口为16bit整数
  • socket接口
    • socket从Linux程序角度来看就是一个file descriptor
    • 地址结构
      CMU CSAPP笔记 第十一章
CMU CSAPP笔记 第十一章
  • 服务器和客户端的连接过程
    • 服务器和客户端都调用socket函数创建文件描述符
    • 服务器调用bind函数准备连接
    • 由于默认socket描述符用于客户端,服务器调用listen函数将其转变为监听描述符,这个描述符服务器自开机运行只创建一次
    • 最后调用accept函数等待服务器请求到达,返回已连接描述符,这个描述符每当一个服务器和客服端连接就创建一个
      • 区分监听和已连接的目的是创建并发服务器,同时处理多个客户端
    • 同时客户端(用户)调用connect函数准备连接,打开clientfd描述符
    • 当客户端断开后,将会向服务器发送EOF结束符,服务器收到后关闭
      • EOF实质上不是一个字符,而是一个内核检测的条件
  • listen函数返回的监听描述符和accept返回的已连接描述符是不同的
    • 前者在服务器开始运行的整个周期内只有一个,后者每和一个客户端连接就产生一个
    • 这样是为了一个服务器可以和多个客户端连接,从而实现并发服务器
  • 如图, 可以用open_clientfd和open_listenfd函数封装这些函数
CMU CSAPP笔记 第十一章
  • 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

HTTP事务

  • HTTP请求
    • 首先要连接服务器和客户端
    • 格式:method URI version
    • method一般为 GET
    • URI为URL端口后面的部分
    • version为HTTP版本,一般为HTTP/1.0或HTTP\1.1
  • HTTP响应的常见状态码
CMU CSAPP笔记 第十一章
  • 传递动态内容
    • ?分割文件名和参数
    • 每个参数用 & 隔开
    • 举例:

      GET /adder?1500&213 HTTP/1.1