计算机网络学习笔记

四种分组延迟

结点处理延迟

排队延迟

传输延迟

传播延迟

物理层功能

接口特性(机械特性,电气特性,功能特性,规程特性)

比特编码

数据率

比特同步(时钟同步)

传输模式(单工,半双工,全双工)

数据链路层功能

负责结点-结点数据传输

组帧

物理寻址

流量控制(避免淹没接收端)

差错控制(检测并重传损坏或丢失帧,并避免重复帧)

访问控制(在任一给定时刻决定哪个设备拥有链路控制使用权)

网络层功能

负责源主机到目的主机数据分组交付(可能穿越多个网络)

逻辑寻址(全局唯一逻辑地址,确保数据分组被送达目的主机,如IP地址)

路由(路由器互联网络,并路由分组至最终目的主机)

分组转发

传输层功能

报文的分段和重组

SAP寻址(确保将完整报文提交给正确进程,如端口号)

连接控制

流量控制

差错控制

会话层功能

对话控制(建立,维护)

同步(在数据流中插入同步点)

表述层功能

数据表示转化(转换为主机摆)

应用层功能

支持用户通过用户代理或网络接口使用网络

典型应用层服务

网络应用的体系结构

客户机/服务器结构(Client-Server,C/S)

点对点结构(Peer-to-peer,P2P)

混合结构(Hybrid)

客户机/服务器结构

服务器

  • 7*24小时提供服务
  • 永久性访问地址/域名
  • 利用大量服务器实现可扩展性

客户机

  • 与服务器通信,使用服务器提供的服务
  • 间歇性接入网络
  • 可能使用动态IP地址
  • 不会与其他客户机直接通信

纯P2P结构

  • 没有永远在线的服务器
  • 任意端系统/节点之间可以直接通讯
  • 节点间歇性接入网络
  • 节点可能改变IP地址
优点:高度可伸缩
缺点:难于管理

混合结构

文件传输使用P2P结构

文件的搜索采用C/S结构——集中式

  • 每个节点向中央服务器登记自己的内容
  • 每个节点向中央服务器提交查询请求,查找感兴趣的内容。

进程:

主机上运行的程序

同一主机上运行的进程之间如何通信?

  • 进程间通信机制
  • 操作系统提供

不同主机上运行的进程间如何通信?

消息交换

套接字:Socket

  • 进程间通信利用socket发送/接受消息实现
  • 类似于寄信
  • 传输基础设施向进程API

应用层协议

  • 网络应用需遵循应用层协议
  • 公开协议
    • 由RFC定义
    • 允许互操作
    • HTTP,SMTP,….
  • 私有协议
    • 多数P2P文件共享应用

应用层协议的内容

  • 消息的类型
    • 请求消息
    • 响应消息
  • 消息的语法/格式
    • 消息中有哪些字段
    • 每个字段如何描述
  • 字段的语义
    • 字段中信息的含义
  • 规则
    • 进程何时发送/响应消息
    • 进程如何发送/响应消息

网络应用对传输服务的需求

  • 数据丢失/可靠性
    • 某些网络应用能够容忍一定的数据丢失:网络电话
    • 某些网络应用要求100%可靠的数据传输:文件传输,telnet
  • 时间/延迟
    • 有些应用只有在延迟足够低时才“有效”
    • 网络电话/网络游戏
  • 带宽
    • 某些应用只有在带宽达到最低要求时才“有效”:网络视频
    • 某些应用能够适应任何带宽——弹性应用:email

Internet提供的传输服务

TCP服务

  • 面向连接:客户机/服务器进程间需要建立连接
  • 可靠的传输
  • 流量控制:发送方不会发送速度过快,超过接收方的处理能力
  • 拥塞控制:当网络负载过过重时能够限制发送方的发送速度
  • 不提供时间/延迟保障
  • 不提供最小带宽保障

UDP服务

  • 无连接
  • 不可靠的数据传输
  • 不提供:
    • 可靠性保障
    • 流量控制
    • 拥塞控制
    • 延迟保障
    • 带宽保障

HTTP协议概述

超文本传输协议

CS结构

HTTP版本:

  • 1.0:RFC 1945
  • 1.1:RFC 2068

使用TCP传输服务

  • 服务器在80端口等待客户的请求
  • 浏览器发起到服务器的TCP连接(创建套接字Socket)
  • 服务器接受来自浏览器的TCP连接
  • 浏览器与Web服务器交换HTTP消息
  • 关闭TCP连接

无状态

  • 服务器不维护任何有关客户端过去所发请求的信息

HTTP连接的两种类型

非持久性连接

  • 每个TCP连接最多允许传输一个对象
  • HTTP 1.0版本使用非持久性连接

持久性连接

  • 每个TCP连接允许传输多个对象
  • HTTP 1.1版本默认使用持久性连接

Web缓存/代理服务器技术

功能

  • 在不访问服务器的前提下满足客户端的HTTP请求

为什么要发明这种技术?

  • 缩短客户请求的响应时间
  • 减少机构/组织的流量
  • 在大范围内实现有效的内容分发

Email应用的构成

  • 邮件客户端

    • 读写Email消息
    • 与服务其交互。收发Email
    • Web客户端
    • outlook,gmail,foxmail
  • 邮件服务器

    • 邮箱:存储发给该用户的Email
    • 消息队列:存储等待发送的Email
  • STMP协议

    • 邮件服务器之间传递消息所使用的协议
    • 客户端:发送消息的服务器
    • 服务器:接收消息的服务器

STMP协议

使用TCP进行email消息的可靠传输

端口25

传输过程的三个阶段

  • 握手
  • 消息的传输
  • 关闭

命令/相应交互模式

  • 命令:ASCII文本
  • 响应:状态代码和语句

Email消息只能包含7位ASCII码

Email消息格式

头部行

  • To
  • From
  • Subject

消息体

  • 消息本身
  • 只能是ASCII字符

邮件访问协议

邮件访问协议:从服务器获取邮件

  • POP:Post Office Protocol
    • 认证/授权
  • IMAP:Internet Mail Access Protocol
    • 更多功能
    • 更加复杂
    • 能够操纵服务器上存储的消息
  • HTTP:163,QQ Mail等

POP协议

认证过程

  • 客户端命令
    • User:声明用户名
    • Pass: 声明密码
  • 服务器响应
    • +OK
    • -ERR
  • 事务阶段
    • List:列出消息数量
    • Retr:用编号获取消息
    • Dele:删除消息
    • Quit

IMAP协议

所有消息统一保存在一个地方:服务器

允许用户利用文件夹组织消息

IMAP支持跨会话的用户状态

  • 文件夹的名字
  • 文件夹与消息ID之间的映射等

DNS

Internet上主机/路由器的识别问题

  • IP地址
  • 域名

域名解析系统DNS

  • 多层命名服务器构成的分布式数据库
  • 应用层协议:完成名字的解析
    • Internet核心功能,用应用层协议实现
    • 网络边界复杂

DNS服务

  • 域名向IP地址的翻译
  • 主机别名
  • 邮件服务器别名
  • 负载均衡:Web服务器

DNS根域名服务器

本地域名解析服务器无法解析域名时,访问根域名服务器

根域名服务器

  • 如果不知道映射,访问权威域名服务器
  • 获得映射
  • 向本地域名服务器返回映射

顶级域名服务器:负责com,org,net,edu等等

权威域名服务器:组织的域名解析服务器,提供组织内部服务器的解析服务

  • 组织负责维护
  • 服务提供商负责维护

本地域名解析服务器

不严格属于层级体系

每个ISP有一个本地域名服务器

  • 默认域名解析服务器

当主机进行DNS查询时,查询被发送到本地域名服务器

  • 作为代理,将查询传发给域名解析服务器系统

DNS查询

迭代查询

递归查询

P2P:搜索信息

文件共享(电驴)

  • 利用索引动态跟踪节点所共享的文件的位置
  • 节点需要告诉索引它拥有哪些文件
  • 节点搜索索引,从而获知能够得到哪些 文件

即时消息(QQ)

  • 索引负责将用户名映射到位置
  • 当用户开启IM应用时,需要通知索引它的位置
  • 节点检索索引,确认用户的IP地址

集中式索引

洪范式查询

层次式覆盖网络

Socket API函数

WSAStartup函数

使用Socket的应用程序在使用Socket之前必须首先调用WSAStartup函数

两个参数:

  • 第一个参数指明程序请求使用的WinSock版本,其中高位字节指明副版本,低位字节指明主版本。
    • 十六进制整数,例如0x102表示2.1版
  • 第二个参数返回实际的WinSock的版本信息
    • 指向WSADATA结构的指针

WSACleanup

  • 应用程序在完成对请求的Socket库的使用最后要调用WSACleanup函数
  • 解除与Socket库的绑定
  • 释放Socket库所占用的系统资源

socket

1
sd = socket(protofamily,type,proto);
  • 创建套接字

  • 操作系统返回套接字描述符(sd)

  • 第一份参数(协议族):protofamily=PF_INET(TCP/IP)

  • 第二个参数(套接字类型):

    type=SOCK_STREAM,SOCK_DGRAM or SOCK_RAW(TCP/IP)

  • 第三个参数(协议号):0为默认

例如:创建一个流套接字的代码段

1
2
3
struct protoent *p;
p=getprotobyname("tcp");
SOCKET sd=socket(PF_INET,SOCK_STREAM,p->p_proto)

Socket面向TCP/IP的服务类型

TCP:可靠、面向连接、字节流传输、点对点

UDP:不可靠、无连接、数据报传输

bind函数

1
int bind(sd,localaddr,addrlen);

绑定套接字的本地端点地址

  • IP地址+端口号

参数

  • 套接字描述符(sd)
  • 端点地址(localaddr)
  • 地址长度(addrlen)

客户程序一般不必调用bind函数

INADDR_ANY

listen函数

1
int listen(sd,queuesize);

置服务器端的流套接字处于监听状态

  • 仅服务器端调用
  • 仅用于面向连接的流套接字

设置连接请求队列大小(queuesize)

返回值:

0:成功

Socket_ERROR:失败

connect函数

1
connect(sd,saddr,saddrlen);
  • 客户程序调用connect函数来使客户套接字(sd)与特定计算机的特定端口(saddr)的套接字(服务)进行连接
  • 仅用于客户端
  • 可用于TCP客户端也可以用于UDP客户端
    • TCP客户端:建立TCP连接
    • UDP客户端:指定服务器端点地址

accept函数

1
newsock = accept(sd,caddr,caddrlen)
  • 服务程序调用accept函数从处于监听状态的流套接字sd的客户连接请求队列中取出排在最前的一个客户请求,并且创建一个新的套接字来与客户套接字创建连接通道
    • 仅用于TCP套接字
    • 仅用于服务器
  • 利用新创建的套接字(newsock)与客户通信

4种类型基本服务器

  • 循环无连接

  • 循环面向连接

  • 并发无连接

  • 并发面向连接

传输层服务和协议

传输层协议为运行在不同Host上的进程提供了一种逻辑通信机制

端系统运行传输层协议

  • 发送方:将应用递交的消息分成一个或多个的Segment,并向下传给网络层
  • 接收方:将接收到的segment组装成消息,并向上交给应用层

传输层可以为应用提供多种协议

  • Internet上的TCP
  • Internet上的UDP

网络层:提供主机之间的逻辑通信机制

传输层:提供应用进程之间的逻辑通信机制

  • 位于网络层之上
  • 依赖于网络层服务
  • 对网络层服务进行增强

多路复用/分用

接收端进行多路分用:传输层依据头部信息将收到的Segment交给正确的Socket,即不同的进程

发送端进行多路复用:从多个Socket接收数据,为每块数据封装上头部信息,生成Segment,交给网络层。

分用如何工作?

主机接收到IP数据报(datagram)

  • 每个数据报携带源IP地址,目的IP地址
  • 每个数据报携带一个传输层的段(Segment)
  • 每个段携带源端口号和目的端口号

主机收到Segment之后,传输层协议提取IP地址和端口号信息,将Segment导向相应的Socket

  • TCP做更多处理

无连接分用(面向UDP)

  • 利用端口号创建Socket
  • UDP的Socket用二元组标识(目的IP地址,目的端口号)
  • 主机收到UDP段后
    • 检查段中的目的端口号
    • 将UDP段导向绑定在该端口号的Socket
  • 来自不同源IP地址和/或源端口号的IP数据包被导向同一个Socket

面向连接的分用(面向TCP)

  • TCP的Socket用四元组标识
    • 源IP地址
    • 源端口号
    • 目的IP地址
    • 目的端口号
  • 接收端利用所有的四个值将Segment导向合适的Socket
  • 服务器可能同时支持多个TCP Socket
    • 每个Socket用自己的四元组标识
  • web服务器为每个客户端开不同的Socket

UDP(用户数据报协议)

基于Internet IP协议

  • 复用/分用
  • 简单的错误校验

“Best effort” 服务,UDP段可能

  • 丢失
  • 非按序到达

无连接

  • UDP发送方和接收方之间不需要握手
  • 每个UDP段的处理独立于其他段

UDP为什么存在?

  • 无需建立连接(减少延迟)
  • 实现简单:无需维护连接状态
  • 头部开销少
  • 没有拥塞控制:应用可更好地控制发送时间和速率

TCP概述

点对点

  • 一个发送方,一个接收方

可靠的,按序的字节流

流水线机制

  • TCP拥塞控制和流量控制机制,设置窗口尺寸

发送方/接收方缓存

全双工

  • 同一连接中能够传输双向数据流

面向连接

  • 通信双方在发送数据之前必须建立连接
  • 连接状态只在连接的两端中维护,在沿途节点中并不维护状态
  • TCP连接包括:两台主机上的缓存,连接状态变量,socket等

流量控制机制

TCP可靠数据传输概述

TCP在IP层提供的不可靠服务基础上实现可靠数据传输服务

流水线机制

累积确认

TCP使用单一重传定时器

触发重传的事件

  • 超时
  • 收到重复ACK

渐进式

  • 暂不考虑重复ACK
  • 暂不考虑流量控制
  • 暂不考虑拥塞控制

拥塞控制原理

拥塞的表现

  • 分组丢失(路由器缓存溢出)
  • 分组延迟过大(在路由器缓存中排队)

拥塞控制的方法

  • 端到端拥塞控制:
    • 网络层不需要显式的提供支持
    • 端系统通过观察loss,delay等网络行为判断是否发生拥塞
    • TCP采取这种方法
  • 网络辅助的拥塞控制
    • 路由器向发送方显式地反馈网络拥塞信息
    • 简单的拥塞指示:SNA,DECbit,TCP/IP ECN,ATM
    • 指示发送方应该采取何种速率

网络层服务

  • 从发送主机向接受主机传送数据段
  • 发送主机:将数据段封装到数据报中
  • 接受主机:向传输层交付数据段
  • 每个主机和路由器都运行网络层协议
  • 路由器检验所有穿越它的IP数据报的头部域
    • 决策如何处理IP数据报

网络层核心功能-转发与路由

转发:将分组从路由器的输入端口转移到合适的输出端口

路由:确定分组从源到目的经过的路径

  • 路由算法

网络层核心功能-连接建立

某些网络的重要功能

  • ATM,帧中继X.25

数据分组传输之前两端主机需要首先建立虚拟/逻辑连接

  • 网络设备(如路由器)参与连接的建立

网络层连接与传输层连接的对比

  • 网络层连接:两个主机之间(路径上的路由器等设备参与其中)
  • 传输层连接:两个应用进程之间(对中间网络设备透明)

网络层服务模型

无连接服务

  • 不事先为系列分组的传输确定传输路径
  • 每个分组独立确定传输路径
  • 不同分组可能传输路径不同
  • 数据报网络

连接服务

  • 首先为系列分组的传输确定从源到目的经过的路径(建立连接)
  • 然后沿该路径(连接)传输系列分组
  • 系列分组传输路径相同
  • 传输结束后拆除连接
  • 虚电路网络

连接服务与无连接服务

数据报网络和虚电路网络是典型两类分组交换网络

数据报网路提供网络层无连接服务

虚电路网络提供网络层连接服务

类似于传输层的无连接服务(UDP)和面向连接服务(TCP)但是网络层服务:

  • 主机到主机服务
  • 网络核心实现

虚电路

虚电路:一条从源主机到目的主机,类似于电路的路径(逻辑连接)

  • 分组交换
  • 每个分组的传输利用链路的全部带宽
  • 源到目的路径经过的网络层设备共同完成虚电路功能

通信过程:呼叫建立—->数据传输—->拆除呼叫

每个分组携带虚电路标识(VCID),而不是目的主机地址

虚电路经过的每个网络设备(如路由器)维护每条经过它的虚电路连接状态

链路,网络设备资源(如带宽,缓存等)可以面向VC进行预分配

  • 预分配资源=可预期服务性能
  • 如ATM的电路仿真(CBR)

VC的具体实现

每条虚电路包括:

1:从源主机到目的主机的一条路径

2:虚电路号(VCID),沿路每段链路一个编号

3:沿路每个网络层设备(如路由器),利用转发表记录经过的每条虚电路

沿某条虚电路传输的分组,携带对应虚电路的VCID,而不是目的地址

同一条VC,在每段链路上的VCID通常不同

  • 路由器传发分组时一句转发表改写/替换虚电路号

虚电路信令协议

用于VC的建立,维护与拆除

  • 路径选择

应用于虚电路网络

  • 如ATM,帧中继网络等

目前的Internet不采用

数据报网络

网络层无连接

每个分组携带目的地址

路由器根据分组的目的地址转发分组

  • 基于路由协议/算法构建转发表
  • 检索转发表
  • 每个分组独立选路

IP分组格式

版本号字段占4位:IP协议的版本号

首部长度字段占4位:IP分组首部长度

  • 以4字节为单位

服务类型(TOS)字段占8位:指示期望获得哪种类型的服务

  • 1998年这个字段改名为区分服务
  • 只有在网络提供区分服务时使用
  • 一般情况下不使用,通常IP分组的该字段(第2字节)的值为00H

总长度字段占16位:IP分组的总字节数(首部+数据)

  • 最大IP分组的总长度:65535B
  • 最小的IP分组首部:20B
  • IP分组可以封装的最大数据:65535-20=65515B

生存时间(TTL)字段占8位:IP分组在网络中可以通过的路由器数(或跳步数)

  • 路由器转发一次分组,TTL减1
  • 如果TTL=0,路由器则丢弃该IP分组

协议字段占8位:指示IP分组封装的是哪个协议的数据包

  • 实现复用/分解
  • 6为TCP,表示封装的为TCP段,17为UDP,表示封装的是UDP数据报

首部校验和字段占16位:实现对IP分组首部的差错检测

  • 计算校验和时,该字段置全0
  • 采用反码算术运算求和,和的反码作为首部校验和字段

源IP地址,目的IP地址字段各占32位:分别标识发送分组的源主机/路由器(网络接口)和接受分组的目的主机/路由器(网络接口)的IP地址

选项字段占长度可变,范围在1~40B之间:携带安全,源选路径,时间戳和路由记录等内容

  • 实际上很少被使用

填充字段占长度可变,范围在0~3B之间:目的是补齐整个首部,符合32位对齐,即保证首部长度是四字节的倍数

IP分片

最大传输单元(MTU)

网络链路存在MTU(最大传输单元)-链路层数据帧可封装数据的上限

大IP分组向较小MTU链路转发时,可以被”分片“

  • 1个IP分组分为多片IP分组
  • IP分片到达目的主机后进行重组

IP首部的相关字段用于标识分片以及确定分片的相对顺序

IP分片过程

  • 假设原IP分组总长度为L,待转发链路的MTU为M
  • 若L>M,且DF=0,则可以/需要分片
  • 分片时每个分片的标识复制原IP分组的标识
  • 通常分片时,除最后一个分片,其他分片均分为MTU允许的最大分片

IP编址

IP分组:

  • 源地址-从哪儿来
  • 目的地址-到哪儿去

接口:主机/路由器与物理链接的连接

  • 实现网络层功能
  • 路由器通常由多个接口
  • 主机通常只有一个或两个接口

IP地址:32比特(IPv4)编号标识主机,路由器的接口

IP地址与每个接口关联

1

2

3

IP子网

IP地址:

网络号—高比特位

主机号—低比特位

|NetID|HostID|

IP子网

  • IP地址具有相同网络号的设备接口
  • 不跨越路由器(第三及以上层网络设备)可以彼此物理联通的接口

子网划分

IP地址:

网络号—高位比特

子网号—原网络主机号部分比特

主机号—低位比特

|NetID|SubID|HostID|

子网掩码

形如IP地址

  • 32位
  • 点分十进制形式

取值

  • NetID,SubID位全取1
  • HostID位全取0

例如

  • A类网的默认子网掩码为:255.0.0.0
  • B类网的默认子网掩码为:255.255.0.0
  • C类网的默认子网掩码为:255.255.255.0
  • 借用3比特划分子网的B网的子网掩码为:255.255.224.0

CIDR

无类域间路由

  • 消除传统的A类,B类和C类地址界限
    • NetID+SubID—>Network Prefix(Prefix)可以任意长度
  • 融合子网地址与子网掩码,方便子网划分
    • 无类地址格式:a,b,c,d/x,其中x为前缀长度

CIDR与路由聚合

无类域间路由

  • 提高IPv4地址空间分配效率
  • 提高路由效率
    • 将多个子网聚合为一个较大的子网
    • 构造超网
    • 路由聚合

DHCP协议

如何获得IP地址

  • 硬编码
    • 静态配置

动态主机配置协议—DHCP

  • 从服务器动态获取
    • IP地址
    • 子网掩码
    • 默认网关地址
    • DNS服务器名称和IP地址
  • ”即插即用“
  • 允许地址重用
  • 支持在用地址续租
  • 支持移动用户加入网络

动态主机配置协议(DHCP)

主机广播 “DHCP discover”(发现报文)

DHCP服务器利用 “DHCP offer”(提供报文)进行相应

主机请求IP地址:“DHCP request”(请求报文)

DHCP服务器分配IP地址:“DHCP ack”(确认报文)

DHCP工作过程:

4

DHCP协议在应用层实现

  • 请求报文封装到UDP数据报中
  • IP广播
  • 链路层广播(e.g.以太网广播)

5

6

DHCP服务器构造ACK报文

  • 包括分配给客户的IP地址,子网掩码,默认网关,DNS服务器地址

网络地址转换(NAT)

动机:

  • 只需/能从ISP申请一个IP地址
    • IPv4地址耗尽
  • 本地网络设备IP地址的变更,无需通告外界网络
  • 变更ISP时,无需修改内部网络设备IP地址
  • 内部网络设备对外界网络不可见,即不可直接寻址(安全)

实现

  • 替换
    • 利用(NAT IP地址,新端口号)替换每个外出IP数据报的(源IP地址,源端口号)
  • 记录
    • 将每对(NAT IP地址,新端口号)与(源IP地址,源端口号)的替换信息存储到NAT转换表中
  • 替换
    • 根据NAT转换表,利用(源IP地址,源端口号)替换每个进入内网IP数据报的(目的IP地址,目的端口号),即(NAT IP地址,新端口号)

NAT穿透问题

解决方案1:静态配置NAT,将特定端口的连接请求转发给服务器

解决方法2:利用UPnP,互联网网关设备协议(IGD-Internet Gateway Device)自动配置

解决方案3:中继(skype)

  • NAT内部的客户与中继服务器建立连接
  • 外部客户也与中继服务器建立连接
  • 中继服务器桥接两个连接的分组

互联网控制报文协议(ICMP)

ICMP支持主机或路由器:

  • 差错报告
  • 网络探询

两类ICMP报文:

  • 差错报告报文(5种)
    • 目的不可达
    • 源抑制
    • 超时/超期
    • 参数问题
    • 重定向
  • 网络探询报文(2组)
    • 回声(Echo)请求与应答报文
    • 时间戳请求与应答报文

例外情况

几种不发送ICMP差错报告报文的特殊情况

  • 对ICMP差错报告报文不再发送ICMP差错报告报文
  • 除第1个IP数据报分片外,对所有后续分片均不发送ICMP差错报告报文
  • 对所有多播IP数据报均不发送ICMP差错报告报文
  • 对具有特殊地址(如127.0.0.0或0.0.0.0)的IP数据报不发送ICMP差错报告报文

几种ICMP报文已不再使用

  • 信息请求与应答报文
  • 子网掩码请求与应答报文
  • 路由器询问和通告报文

ICMP报文的格式

7

ICMP差错报告报文数据封装:

8

ICMP应用举例:Traceroute

源主机向目的主机发送一些列UDP数据报

  • 第1组IP数据报TTL=1
  • 第2组IP数据报TTL=2,etc
  • 目的端口号为不可能使用端口号

当第n组数据报(TTL=n)到达第n个路由器时:

  • 路由器丢弃数据报
  • 向源主机发送ICMP报文(type=11,code=0)
  • ICMP报文携带路由器名称和IP地址信息