课程主页:http://www.cs.cmu.edu/afs/cs/academic/class/15213-f15/www/schedule.html

课程资料:https://github.com/EugeneLiu/translationCSAPP

课程视频:https://www.bilibili.com/video/av31289365/

这一部分回顾Lecture 21至Lecture 22,介绍了网络编程。

备注:图片和总结内容均来自于课件。

说明:

大部分内容已经整理过,这部分参考之前的笔记:

https://doraemonzzz.com/2021/09/22/2021-9-22-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F-%E7%AC%AC11%E7%AB%A0-%E7%AC%94%E8%AE%B0%E6%95%B4%E7%90%86/

这里仅仅进行补充。

Lecture 21

计算机网络

  • 网络是按地理邻近性组织的盒子和电线的分层系统
    • SAN(系统局域网)跨越集群或机房
      • 交换式以太网、Quadrics QSW、……
    • LAN(局域网)跨越建筑物或校园
      • 以太网是最突出的例子;
    • WAN(广域网)跨越国家或世界
      • 典型的高速点对点电话线;
  • 互联网络(internet)是一组相互连接的网络
    • 全球IP互联网(Global IP Internet)是最著名的互联网(internet)示例;

众所周知的端口和服务名称

  • 热门服务已经永久分配了知名端口和对应的知名服务名称:
    • echo服务:7/echo
    • ssh服务器:22/ssh
    • 电子邮件服务器:25/smtp
    • 网络服务器:80/http
  • 众所周知的端口和服务名称之间的映射包含在每台Linux机器上的/etc/services文件中。

连接剖析

连接由其端点的套接字地址(套接字对,(cliaddr:cliport, servaddr:servport))唯一标识:

使用端口识别服务

套接字

  • 什么是套接字

    • 对内核来说,套接字是通信的端点;
    • 对于应用程序,套接字是一个文件描述符,它允许应用程序从/向网络读/写;
      • 记住:所有Unix I/O设备,包括网络,都被建模为文件;
  • 客户端和服务器通过读取和写入套接字描述符来相互通信:

  • 常规文件I/O和套接字I/O之间的主要区别在于应用程序如何“打开”套接字描述符;

套接字地址结构

  • 通用套接字地址:

    • 用于连接、绑定和接受的地址参数;

    • 该结构是必要的,因为在设计套接字接口时C没有通用(void *)指针;

    • 为方便转换,我们采用 Stevens 约定:

      typedef struct sockaddr SA;
    • 代码:

      struct sockaddr { 
        uint16_t  sa_family;    /* Protocol family */ 
        char      sa_data[14];  /* Address data.  */ 
      };       
    • 内存结构:

  • Internet专用套接字地址:

    • 对于采用套接字地址参数的函数,必须将(struct sockaddr_in )转换为(struct sockaddr )。

    • 代码:

      struct sockaddr_in  { 
        uint16_t        sin_family;  /* Protocol family (always AF_INET) */ 
        uint16_t        sin_port;    /* Port num in network byte order */ 
        struct in_addr  sin_addr;    /* IP addr in network byte order */ 
        unsigned char   sin_zero[8]; /* Pad to sizeof(struct sockaddr) */ 
      };
    • 内存结构:

套接字接口

客户端-服务器事物的上下文中的套接字接口:

流程:

  1. 开启服务器;
  2. 开启客户端;
  3. 交换数据;
  4. 断开客户端;
  5. 删除客户端;

基本互联网元素

  • 互联网主干(Backbone):
    • 通过高速点对点网络连接的路由器(全国或全球)的集合;
  • 互联网交换点(IXP):
    • 连接多个主干网(通常称为对等点)的路由器;
    • 也称为网络接入点(NAP);
  • 区域网络(Regional net):
    • 覆盖较小地理区域(例如,城市或州)的较小骨干网;
  • 存在点(POP):
    • 连接到互联网的机器;
  • 互联网服务提供商(ISP):
    • 提供对POP的拨号或直接访问;

Internet 连接层次结构

IP地址结构

  • IP(V4)地址空间分为几类:

  • 网络ID以w.x.y.z/n格式书写

    • n = 主机地址中的位数
    • 例如,CMU写为128.2.0.0/16
      • B类地址
  • 未路由(私有)IP 地址:

    • 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16

互联网的进化

  • 原始想法
    • Internet上的每个节点都有唯一的IP地址
      • 每个人都可以直接与每个人交谈;
    • 没有保密或认证
      • 同一LAN上的路由器和主机可见消息;
      • 可以在包头中伪造源字段;
  • 缺点
    • 没有足够的可用IP地址;
    • 不希望每个人都可以访问或了解所有其他主机;
    • 安全问题;

互联网的进化:命名

  • 动态地址分配
    • 大多数主机不需要知道地址
      • 只有那些充当服务器的主机需要
    • DHCP(动态主机配置协议)
      • 本地ISP分配临时使用的地址
  • 例子:
    • CMU笔记本电脑(有线连接)
      • IP地址128.2.213.29(bryant-tp4.cs.cmu.edu)
      • 静态分配
    • 家里的笔记本电脑
      • IP地址192.168.1.5
      • 仅在家庭网络内有效

互联网的进化:防火墙

  • 防火墙

    • 对Internet的其余部分隐藏组织节点;
    • 在组织内使用本地IP地址;
    • 对外服务,提供代理服务;
      • 客户端请求:src=10.2.2.2,dest=216.99.99.99
      • 防火墙转发:src=176.3.3.3,dest=216.99.99.99
      • 服务器响应:src=216.99.99.99,dest=176.3.3.3
      • 防火墙转发响应:src=216.99.99.99, dest=10.2.2.2

Lecture 22

代理

  • 代理是客户端和源服务器之间的中介
    • 对客户端来说,代理就像一个服务器
    • 对于服务器来说,代理就像一个客户端

为什么使用代理?

  • 可以在请求和响应通过时执行有用的功能
    • 示例:缓存、日志记录、匿名化、过滤、转码