四种分组延迟
结点处理延迟
排队延迟
传输延迟
传播延迟
物理层功能
接口特性(机械特性,电气特性,功能特性,规程特性)
比特编码
数据率
比特同步(时钟同步)
传输模式(单工,半双工,全双工)
数据链路层功能
负责结点-结点数据传输
组帧
物理寻址
流量控制(避免淹没接收端)
差错控制(检测并重传损坏或丢失帧,并避免重复帧)
访问控制(在任一给定时刻决定哪个设备拥有链路控制使用权)
网络层功能
负责源主机到目的主机数据分组交付(可能穿越多个网络)
逻辑寻址(全局唯一逻辑地址,确保数据分组被送达目的主机,如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 | struct protoent *p; |
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地址与每个接口关联
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工作过程:
DHCP协议在应用层实现
- 请求报文封装到UDP数据报中
- IP广播
- 链路层广播(e.g.以太网广播)
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报文的格式
ICMP差错报告报文数据封装:
ICMP应用举例:Traceroute
源主机向目的主机发送一些列UDP数据报
- 第1组IP数据报TTL=1
- 第2组IP数据报TTL=2,etc
- 目的端口号为不可能使用端口号
当第n组数据报(TTL=n)到达第n个路由器时:
- 路由器丢弃数据报
- 向源主机发送ICMP报文(type=11,code=0)
- ICMP报文携带路由器名称和IP地址信息