计算机网络笔记(更新中)

第1章 计算机网络与因特网

1.1 计算机网络与协议

1.1.1 计算机网络

概念

计算机网络 = 通信技术 + 计算机技术 = 通信网络
= 互连(用交换节点组成的交换网络)的、自治(无主从关系)的计算机集合
ISP:网络服务提供商
Internet:ISP网络互连的网络之网络

组成部分

  1. 组成细节角度
    计算设备主机/端系统 运行分布式应用
    通信链路
    分组交换路由器(链路层)交换机
    硬件基础
  2. 服务角度
    为应用提供 通信服务通信基础设施
    为应用提供 应用编程接口(类似于邮政系统) 有服务、有规则

1.1.2 协议

协议

  • 有序运行的保证
  • 数据交换必须遵守的约定好的规则

网络协议

  • 为进行网络中的数据交换而进建立的规则、标准或规定。
  • 规定通信实体间的信息格式、意义、顺序、及对应执行动作

三要素

  • 语法
    数据与控制信息的结构或格式
    信号电平
  • 语义
    需何时发出何种控制信息
    完成何种动作和作出何种响应
    差错控制
  • 时序
    事件顺序
    速度匹配

Internet协议标准 RFC

协议规范了网络中所有信息的接受和发送过程。

1.2 网络结构

1.2.1 计算机网络结构

  • 网络边缘
  • 接入网络
  • 网络核心

网络边缘
主机/端系统

  • 客户/服务器模型
  • 对等应用模型

接入网络
指有线或无线通信链路

  • 数字用户线路DSL( 电话
    数据通信:通过DSL电话线连接Internet,与CO(中心局)的DSLAM交换数据。
    语音通信:通过DSL电话线连接电话网络。‘
    特点:各户独占一条通信链路。
    FDM(频分)
电话 上行 下行
带宽 0 ~ 4kHz 4kHz ~ 50kHz 50kHz ~ 1MHz
速率 \ < 2.5Mbps < 24Mbps
典型速率 \ < 1Mbps < 10Mbps

计算机网络笔记(更新中)_第1张图片

  • 电缆网络(HFC 有线电视
    速率具有非对称特性,上行速率为2Mbps,下行速率为30Mbps。
    各家庭共享广播媒体。
    通过电缆网络连接光纤接入ISP路由器,与CMTS交换数据。

计算机网络笔记(更新中)_第2张图片

  • 典型家庭接入网
    计算机网络笔记(更新中)_第3张图片
  • 机构接入网
    典型传输速率:10 Mbps, 100Mbps, 1Gbps, 10Gbps
    目前,端系统通常直接连接以太网交换机计算机网络笔记(更新中)_第4张图片
  • 无线接入网
    通过共享的无线接入网( 基站“接入点” )连接端系统或路由器
无线局域网LANs 广域无线接入网
范围 同一建筑物内 (30m) 通过电信运营商 (蜂窝网) ,接入范围在几十公里
类型 802.11b/g (WiFi) 3G、4G: LTE / 移动互联网
带宽 11 Mbps、 54 Mbps 1 Mbps、10 Mbps、100 Mbps

网络核心
互联的路由器网络

关键功能:路由 + 转发 → 数据交换
路由 :从源主机到目的主机的逻辑路径
转发 :从路由器的输入端口到输出端口

1.2.2 Internet结构

ISP网络之网络
计算机网络笔记(更新中)_第5张图片
IXP:互联网交换中心,各ISP之间数据交换的接口。
一级“商业”ISP:国家或国际范围。
内容提供商网络:私有网络,连接其数据中心和Internet,绕过一级或区域ISP。
区域ISP:连接多个接入ISP。
接入ISP:端系统通过接入ISP(access ISPs )连接到 Internet。

1.3 数据交换

  • 需求
    1. 不可能实现完全的互联
    2. 实现数据通过网络核心从源主机到目的主机
  • 本质:动态分配传输资源
  • 类型
    1. 电路交换
    2. 报文交换
    3. 分组交换

1.3.1 电路交换

  • 最典型的电路交换网络:电话网络
  • 三阶段
    1. 建立连接
    2. 通信
    3. 释放连接
  • 独占资源 —— 多路复用实现

多路复用

链路、网络资源划分成多个“资源片”

过程

  1. 分配给呼叫
  2. 呼叫独占资源片
  3. 可能闲置

方法

TDM、FDM、WDM、CDM

TDM:划分时间帧,周期使用
FDM、WDM:划分频率带宽为模拟信道
CDM:按编码划分

  • 举例:
  • 在CDM中,为便于计算,0表示为-1,1表示为1。
  • A、B、C通信,A码片序列为 (-1, 1, -1, 1),B码片序列为 (1, 1, 1, -1),C码片序列为 (-1, -1, 1, 1)。
  • A发送数据为 (0, 1),B发送数据为 (1, 1)
  • A得到的传输信号:(1, -1, 1, -1, -1, 1, -1, 1)
  • B得到的传输信号:(1, 1, 1, -1, 1, 1, 1, -1)
  • A、B同时传输得到的传输信号:(2, 0, 2, 0, 0, 2, 0, 0)
  • 解码保证得到的结果中任一位信号di ∈ [-1, 1]即可

1.3.2 报文交换

信息整体传输

1.3.3 分组交换

适用于突发数据传输网络

分组

  • 报文拆分的数据包
  • 拆分、重组会增加开销
  • 共用链路时,共用组的分组序列不确定,按需进行传输

共同点

二者均采用存储—转发的交换方式

交换传输时延

假设有n个路由器连接A、B,报文为M bits,速率为R bps,分组交换采取的分组大小为L bits,则:
报文交换的时延:n * M / R
分组交换的时延:M / R + n * L / R

1.4 网络性能

速率

数据率,即 每单位时间传输的bit位数 。单位:bps,kbps,……

带宽

在网络信道中的最高数据率。单位同上

时延

包括四种分组延迟:

  • dproc :结点处理延迟 —— 差错检测、查路由表
  • dqueue :排队延迟 —— 等待输出可用
  • dtrans :传输延迟 —— 一次发送一个分组所用时间 L / R
  • dprop :传播延迟 —— 一个分组从链路的一端到另一端所用的时长 d / s

传输延迟与传播延迟

传输延迟可看作:收费站闸门打开的时间
传播延迟可看作:车辆在一段高速公路上的所用时间

流量强度

L * a / R

  • a 表示分组到达的平均速率
  • 当流量强度 → 0,dqueue → 0
  • 当流量强度 → 1,dqueue 很大
  • 当流量强度 > 1,dqueue → ∞

时延带宽积

传播时延 * 带宽 = dprop * R

丢包率

丢包数 / 已发分组总数

吞吐率/量

  • 在发送端与接收端之间的数据速率
  • 即,单位时间内某个信道中的数据总量
  • 受限于瓶颈链路,min{ Ri }

1.5 网络体系结构

  • 分层结构描述:各层特定功能
  • 功能描述:遵守某个/些协议

实体

任何可发送或接收信息的 硬件软件过程

协议

控制两个 对等实体 通信的规则集合
水平的

服务

下层为上层提供服务
下层实现对上层是 透明 、不可见的
垂直的

接口

相邻层 通过 接口 交互
通过 服务访问点 SAP 指定特定服务

1.5.1 OSI模型

由ISO组织提出

  • 应用层 —— 通过用户代理和网络接口使用网络服务
  • 表示层 —— 数据表示转化(语义、语法在不同系统间的转换),加密/解密,压缩/解压
  • 会话层 —— 对话控制、同步 最薄弱的一层
  • 传输层 —— 源到目的进程间(端到端)完整报文传输
    分段、重组
    SAP寻址(正确的进程)
    连接、流量、差错控制

—————————————— 以上为 端到端层

  • 网络层 —— 源到目的的数据分组交付,逻辑寻址
    路由
    分组转发
  • 数据链路层 —— 结点—结点间数据传输,组帧,物理寻址
    流量控制
    差错控制
    访问/接入控制
  • 物理层
    接口特性
    比特编码
    数据率
    比特同步
    传输模式

数据封装

所有参考模型均使用这一模式
增加控制信息,构造协议数据单元PDU

  • 地址、标识
  • 差错控制编码
  • 协议控制

计算机网络笔记(更新中)_第6张图片

1.5.2 TCP/IP参考模型

  • 应用层
  • 运输层
  • 网际层
  • 网络接口层

一切依靠IP,一切为了IP

1.5.3 5层参考模型

  • 应用层 —— 网络应用
  • 传输层 —— 进程—进程数据传输
  • 网络层 —— 源主机—目的主机的路由、转发
  • 数据链路层 —— 相邻网络节点的数据传输
  • 物理层 —— 比特传输

第2章 应用层

2.1 网络应用的体系结构

2.1.1 客户机/服务器(C/S)结构

服务器

  • 多个、具有可扩展性
  • 永久域名/IP地址
  • 无间断服务

客户机

  • 间歇性接入网络
  • 可能使用动态IP地址
  • 不与其他客户机通信

2.1.2 点对点(P2P)结构

  • 两节点间歇性接入网络
  • 均可能改变IP地址
  • 可直接通信
  • 优点:高度可伸缩
  • 缺点:难于管理

2.1.3 混合结构

  • C/S结构与P2P结构相结合
  • 典型:Napster
    传输文件:P2P
    搜索文件:C/S

2.1.4 网络应用进程通信

同一主机

操作系统提供通信

不同主机

报文(消息)交换

  • 客户进程:发起请求
  • 服务进程:接收请求
  • 利用socket发送/接收消息
  • 进程标识符:主机IP地址 + 端口号

应用层协议内容

  • 报文类型
  • 报文语法/格式
  • 字段语义
  • (响应与发送的)规则

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

  • 数据丢失/可靠性
  • 时间/延迟
  • 带宽

其中,传输层的TCP/UDP协议均不保证 时间/延迟带宽

典型网络协议计算机网络笔记(更新中)_第7张图片
FTP简介

  • 有状态
  • 包括控制连接和数据连接
  • 控制连接 → 发送请求和响应命令
  • 数据连接 → 传输数据

2.2 Web应用

2.2.1 概述

  • 由多个对象组成网页

  • 对象寻址

    URL:统一资源定位器
    host name + port / path name

  • 协议:HTTP 1.0/1.1

    默认使用 TCP
    服务器端口号:80

  • 体系结构:C/S

  • 无状态

2.2.2 HTTP协议

1、连接类型

  • 非持久性连接:每个TCP连接允许传输最多一个对象

    HTTP 1.0 默认

  • 持久性连接:每个TCP连接允许传输多个对象

    HTTP 1.1 默认

连接流程
计算机网络笔记(更新中)_第8张图片

连接类型 响应时间
非持久性连接 每个对象需要2个RTT
持久性无流水连接 每个对象需要1个RTT
持久性流水连接 所有对象需要1个RTT
  • 持久性流水连接是HTTP1.1默认连接类型
  • 每个TCP连接的发起、建立都需要1RTT

2、消息格式

使用ASCII编码

请求消息

计算机网络笔记(更新中)_第9张图片
请求行

method 作用
POST 提交表单到服务器
GET 从服务器获取请求对象
HEAD 不将请求对象放入响应消息,可用于测试
PUT 上传至URL指定路径
DELETE 删除URL指定文件
CONNECT 向代理服务器发送代理请求
  • HTTP1.0仅使用:POST、GET、HEAD

响应消息

格式与请求消息格式基本相同,仅第一行为状态行

version sp state

状态行

state 含义
200 OK 正常响应
301 Move Permanently 对象资源已永久移动
302 Move Temporarily 对象资源暂时移动
304 Not Modified 对象内容没有修改
400 Bad Requst 格式错误
404 Not Found 指定URL不存在对象
505 HTTP Version Not Supported HTTP版本错误

2.2.3 Cookie技术

  • 为辨别用户身份、进行Session跟踪而存储在用户本地终端上的数据。(通常经过加密)
  • 客户机保存Cookie文件,由浏览器管理
  • 服务器后台数据库保存各Cookie对应数据信息
  • 存在隐私问题
    计算机网络笔记(更新中)_第10张图片

2.2.4 Web缓存/代理服务器技术

需求

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

功能

在不直接访问服务器的前提下满足HTTP请求

  • 用户设定浏览器通过缓存(代理服务器)进行访问

  • 代理服务器接收客户请求

    缓存中有请求对象 —— 直接发送响应消息
    缓存中无请求对象 —— 代理服务器向服务器发送HTTP请求

一般由ISP提供

条件性GET方法

  • 目的:对已有缓存维持其最新版本,不必每次请求都从服务器返回请求对象
  • 由代理服务器定期发送
    计算机网络笔记(更新中)_第11张图片

2.3 Email应用

2.3.1 概述

组成构件

  • 邮件客户端

    读、写Email消息
    与服务器交互,收、发Email消息

  • 邮件服务器

    邮箱:存储发给某一用户的Email消息
    消息队列:存储等待发送的Email消息

协议

  • SMTP协议
  • 用于邮件服务器之间传递消息
  • 下层协议:TCP
  • 服务器端口号:25

特点

  • 消息只使用 7位ASCII码 编码

  • 命令/响应交互模式

    命令(command):ASCII文本消息
    响应(response):状态代码语句

  • 使用持久性连接

  • CRLF.CRLF 确定结束消息传输

传输过程三阶段

  • 握手
  • 消息传输
  • 关闭

SMTP交互示例
计算机网络笔记(更新中)_第12张图片
HTTP与SMTP

相同点

  1. 都使用命令/响应模式
  2. 都使用ASCII码编码

不同点

  1. 对象与响应

    · HTTP:每个对象有独立的响应消息
    · SMTP:多个对象在由多部分构成的消息中

  2. 协议特性

    · HTTP:“拉”协议
    · SMTP:“推”协议

2.3.2 Email消息格式

RFC 822:文本消息格式标准

头部行

  • To
  • From
  • Subject
  • MIME 多媒体扩展
  • 数据编码方法
  • 数据类型

消息体

已编码的消息
计算机网络笔记(更新中)_第13张图片

2.3.3 邮件访问协议

目的

从服务器获取邮件

POP3

  • 无状态

  • 模式

    下载并删除:从客户端下载即删除
    下载并保持:各客户端均保留拷贝

  • 认证过程

    • 客户端命令

      User:声明用户名
      Pass:声明密码

    • 服务器响应

      +OK
      -ERR

  • 事务阶段

    • List:列出消息数量
    • Retr:用编号获取消息
    • Dele:删除消息
    • Quit

IMAP

  • 有状态
  • 所有消息保存在服务器
  • 可用文件夹组织消息
  • 支持跨会话的用户状态

HTTP

既可作为邮件访问协议,也可作为邮件发送协议。

2.4 DNS

  • 域名解析系统
  • 多层服务器构成的分布式数据库
  • 解决域名IP映射、负载均衡、别名问题等

DNS层次体系
计算机网络笔记(更新中)_第14张图片

  • 根域名服务器 —— 全世界的IPv4根服务器仅13台
  • 顶级域名服务器 —— 负责com、org、net、edu等顶级域名和cn、fr等国家顶级域名的解析
  • 权威域名服务器 —— 组织的域名解析服务器,提供组织内部服务器的解析服务
  • 顶级域名服务器和权威域名服务器之间可能存在多层服务器

本地域名服务器

  • 不严格属于层次体系
  • 每个ISP有一个本地域名服务器,默认为该ISP的权威服务器
  • 为ISP内主机提供DNS代理查询服务
  • 获得IP映射即缓存,但具有有效期限
  • 常缓存顶级域名服务器的IP映射,由此在进行DNS查询时可以不必查询根域名服务器

DNS查询方式

迭代查询
计算机网络笔记(更新中)_第15张图片
递归查询
计算机网络笔记(更新中)_第16张图片
资源记录

name value type ttl
主机域名 主机IP地址 A /
域名 对应的权威域名服务器的主机域名 NS /
某一真实域名的别名 该真实域名 CNAME /
邮件服务器别名 邮件服务器主机域名 MX /

DNS协议

  • 默认使用 UDP
  • 服务器端口号为 53
  • 查询/回复格式相同

消息格式
计算机网络笔记(更新中)_第17张图片
注册域名流程
计算机网络笔记(更新中)_第18张图片

2.5 P2P

常用于文件分发

原理与文件分发

  • C/S结构分发时间:max { NF / us , F / mini { di } }

  • P2P结构分发时间:max { F / us , F / mini { di } , NF / ( us + Σi ui ) }
    计算机网络笔记(更新中)_第19张图片
    BitTorrent 协议

  • Torrent:交换同一个文件的节点组

  • Tracker:跟踪参与Torrent的节点

  • 文件划分为多个256KB的chunk

  • 节点加入

    向tracker注册,获取节点清单,与一些节点(一般邻居数少于10个)建立连接。
    下载同时,向其他节点上传chunk。

  • 获取chunk

    定期查询“邻居”,稀缺优先

  • 发送chunk(tit for tat)

    选择向自己发送chunk速率最大的4个邻居发送(每10s更新)
    随机选择一个其他节点发送(每30s更新)

索引

进程级 —— IP地址 + 端口号

  • 集中式索引:所有索引由中央服务器保存

    例子:Napster

  • 洪泛式查询:完全分布式,每个节点对它共享的文件进行索引

    例子:Gnutella

  • 层次式覆盖网络:一个节点或者是一个超级节点,或者被分配到一个超级节点,并被其跟踪拥有的文件内容

    覆盖网络 :由所有 活动节点边(TCP连接) 构成。
    本质是P2P —— 索引分布在超级节点上
    例子:Skype

2.6 Socket编程

2.6.1 编程接口

各网络层次编程接口
计算机网络笔记(更新中)_第20张图片
应用编程接口

应用与操作系统控制权转换
计算机网络笔记(更新中)_第21张图片

  • UNIX:Socket
  • microsoft:WINSOCK

Socket API

  • 通信模型:C/S结构
  • 是应用进程间通信的抽象机制
  • 对外标识(网络通信识别):IP地址 + 端口号
  • 对内标识(操作系统管理):套接字描述符

计算机网络笔记(更新中)_第22张图片

Socket抽象与地址结构

当应用进程创建套接字时

  • 操作系统分配一个数据结构存储该套接字
  • 返回套接字描述符

计算机网络笔记(更新中)_第23张图片
在这里插入图片描述
计算机网络笔记(更新中)_第24张图片

  • sin_port 绑定端口号时使用htons
  • sin_addr 绑定IP地址时使用htonl
  • 二者均需由主机字节顺序转换为 网络字节顺序

2.6.2 Socket编程函数

1. WSAStartup

int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);

  • 在微软系统中,应用程序在使用Socket之前必须首先调用WSAStartup函数 两个参数

  • 第一个参数指明程序请求使用的WinSock版本,其中高位字节指明副版本、低位字节指明主版本

    十六进制整数,例如0x102表示2.1版

  • 第二个参数返回实际的WinSock的版本信息

    指向WSADATA结构的指针

  • 例:使用2.1版本的WinSock的程序代码段

    wVersionRequested = MAKEWORD( 2, 1 );
    err = WSAStartup( wVersionRequested, &wsaData );

2. WSACleanup

int WSACleanup (void);

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

3. socket

sd = socket( int protofamily, int type, int proto );

  • 创建套接字

  • sd 为操作系统返回的套接字描述符

  • protofamily(协议族):protofamily = PF_INET(TCP/IP)

  • type(套接字类型)

    SOCK_STREAM:TCP套接字
    SOCK_DGRAM:UDP套接字
    SOCK_RAW:直接使用网络层协议的套接字

  • proto(协议号):默认为0

  • 例:创建一个流(TCP)套接字的代码段


struct protoent *p;

p = getprotobyname("tcp");

SOCKET sd = socket(PF_INET,SOCK_STREAM,p->p_proto);

4. closesocket

int closesocket( SOCKET sd );

  • 关闭一个描述符为sd的套接字

  • 多进程共享一个套接字时,调用一次closesocet,该套接字引用次数减1;减至0时,套接字关闭

  • 多线程共享一个套接字时,引用数仅为1;任何一个线程关闭套接字,其他线程都无法访问该套接字

  • 返回值:

    0:成功
    SOCKET_ERROR(-1):失败

5. bind

int bind( SOCKET sd, const struct sockaddr * localaddr, int addrlen );

  • 绑定套接字的本地端点地址与其描述符
  • 仅服务器调用
  • sd(套接字描述符)
  • localaddr(端点地址):在Internet通信中可直接使用 struct sockaddr_in 结构体代替

// 初始化bindAddr

SOCKADDR_IN bindAddr;

bindAddr.sin_family = AF_INET;

bindAddr.sin_addr.s_addr = htonl(INADDR_ANY);

bindAddr.sin_port = htons(PORT);

  • addrlen(地址长度):可用 sizeof( localaddr ) 表示
  • localaddr、addrlen必须是已知的
  • 例:为一个套接字绑定地址的代码段

if(bind(majorSd, (struct sockaddr *) &bindAddr, sizeof(bindAddr)) ==

-1) // 绑定套接字地址

{

printf("套接字绑定本地地址失败!\n");

return 0;

}

6. listen

int listen( SOCKET sd, int queuesize );

  • 令服务器端某一套接字处于监听状态,即被动等待连接状态
  • 由使用TCP套接字(面向连接)的服务器调用
  • queuesize(连接请求队列大小):通常设为1,即一次仅接受1个连接

7. accept

SOCKET
accept( SOCKET sd, struct sockaddr *addr, int *addrlen);

  • 通过描述符为sd的套接字向服务器发送请求的客户端被指定与返回的新建套接字建立连接

  • 由使用TCP套接字(面向连接)的服务器调用

  • addr、addrlen均设为NULL即可

8.connect

int connect( SOCKET sd, struct sockaddr *addr, int addrlen);

  • 仅客户端调用
  • 对于TCP客户端而言,调用该函数可与指定地址建立连接
  • 对于UDP客户端而言,调用该函数可向指定地址发送数据
  • 例:通过DNS查询服务器域名后进行连接的代码段

struct hostent *host = gethostbyname(header->host); // 查询主机域名的IP地址

if(!host){

    printf("查询不到主机 %s 的IP地址\n", header->host);

    return;

}

// 目的主机addr

SOCKADDR_IN serverAddr;

serverAddr.sin_family = AF_INET;

serverAddr.sin_addr.s_addr = inet_addr(inet_ntoa(*(struct in_addr*)host->h_addr_list[0]));

serverAddr.sin_port = htons(HTTP_PORT);

if (connect(proxySocket, (struct sockaddr *) &serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) // 连接失败

{

    printf("无法连接主机 %s\n", header->host);

    return;

}

9. send / sendto

int send( SOCKET sd, const char *buf, int buflen, int flag);

  • TCP服务器与客户端通信间发送数据使用

  • 使用了connect函数的UDP客户端发送数据使用

int sendto( SOCKET sd, const char *buf, int buflen, int flag, const struct sockaddr *destaddr, int addrlen);

  • UDP服务器发送数据使用

  • 未使用connect函数的UDP客户端发送数据使用

10. recv /recvfrom
int recv( SOCKET sd, const char *buf, int buflen, int flag);

  • TCP服务器与客户端通信间接收数据使用

  • 服务器从使用了connect函数的UDP客户端接收数据使用

int recvfrom( SOCKET sd, const char *buf, int buflen, int flag, const struct sockaddr *senderaddr, int addrlen);

  • 从UDP服务器接收数据使用

  • 从未使用connect函数的UDP客户端接收数据使用

11. setsockopt / getsockopt

int setsockopt( int sockfd, int level, int optname, const void *optval, socklen_t optlen );

  • sockfd:标识一个套接口的描述字。
  • level:选项定义的层次;支持SOL_SOCKET、IPPROTO_TCP、IPPROTO_IP和IPPROTO_IPV6。
  • optname:需设置的选项。
  • optval:指针,指向存放选项待设置的新值的缓冲区。 optlen:optval缓冲区长度。

int getsockopt( int sockfd, int level, int optname, void *optval, socklen_t *optlen );

  • sockfd:一个标识套接口的描述字。
  • level:选项定义的层次。例如,支持的层次有SOL_SOCKET、IPPROTO_TCP。
  • optname:需获取的套接口选项。
  • optval:指针,指向存放所获得选项值的缓冲区。
  • optlen:指针,指向optval缓冲区的长度值。

12. gethostbyname

struct hostent *gethostbyname( const char *name );

  • 由域名获取IP地址
  • 返回一个结构体指针
struct hostent{

    char *h_name;          // 正式主机名

    char ** h_aliases;     // 主机别名

    short h_addrtype;      // 主机IP地址类型:IPV4-AF_INET
    
    short h_length;        // 主机IP地址字节长度,IPv4为32位
    
    char ** h_addr_list;   // 主机的IP地址列表(字符串形式)
    
};
  • h_addr_list的各行字符串为点分十进制格式,如:127.0.0.1

13. inet_addr / inet_nota

  • inet_addr:将点分十进制字符串转换为网络字节的IP地址
  • inet_ntoa:将32位网络字节IP地址转换为点分十进制字符串

14. htonl / htons

  • htonl:将long类型整数转换为网络字节
  • htons:将short类型整数转换为网络字节

第3章 传输层

3.1 传输层概述

特点

应用进程间的逻辑通信

服务

  • 可靠数据传输机制
  • 流量控制机制
  • 拥塞控制机制
  • 多路分用/复用

协议

  • UDP

    Best-Effort

  • TCP

    拥塞控制
    流量控制
    连接建立

3.2 分用与复用

本质

将主机—主机间的交付拓展到进程—进程间的交付。

应用场景

  • 上层有多个实体/协议
  • 发送方 —— 复用
  • 接收方 —— 分用
  • 分用与复用不是仅应用于传输层

标识

  • UDP Socket 标识:二元组 (目的IP地址,目的端口号)

  • TCP Socket 标识:四元组 (源IP地址,源端口号,目的IP地址,目的端口号)

    四元组可有效区分多线程Socket

  • Socket不一定与进程一 一对应

周知端口号

1 ~ 1023
服务器可使用bind绑定周知端口号

3.3 UDP协议

3.3.1 协议基本特点

  • 基于Internet IP协议

    复用/分用

    简单的错误校验

    “Best effort”服务

  • 无连接

    发送方与接收方之间不需要握手

    每个UDP段的处理互相独立

  • 常用于流媒体

    容忍丢失

    速率敏感

  • 实现可靠数据传输

    在应用层增加可靠性机制和错误恢复机制,可实现基于UDP的可靠数据传输

  • 报文段格式
    计算机网络笔记(更新中)_第25张图片

3.3.2 校验和

计算范围

伪首部 + UDP首部 + 报文(消息)

伪首部

  • 源IP地址(32位)
  • 目的IP地址(32位)
  • UDP段的长度,即UDP首部+数据(16位)
  • 协议类型(8位)
  • 0x0(8位)

计算方法

将每16位视为一个整型数,求和,进位加在最低位,对最终结果按位取反

3.4 rdt 可靠数据传输协议

可靠

  • 无错误

  • 无丢失

  • 无乱序

通过协议实现可靠数据传输服务计算机网络笔记(更新中)_第26张图片

接口计算机网络笔记(更新中)_第27张图片

设计思路

  • 由简到繁渐进地设计发送方与接收方的协议

  • 只考虑单向传输,实际为双向流动

  • 利用有限状态机(FSM)来刻画传输协议

计算机网络笔记(更新中)_第28张图片

3.4.1 rdt 1.0

假设前提

底层信道完全可靠

  • 无错误

  • 无丢失

发送方与接收方的FSM互相独立

计算机网络笔记(更新中)_第29张图片

3.4.2 rdt 2.0

假设前提

底层信道可能产生位错误。

新机制

  • 差错检测

    校验和

  • 恢复机制

    确认机制ACK

    重传机制

    采用确认重传机制的协议被称为ARQ(自动重传请求)协议。

发送方与接收方的FSM

停—等协议:仅当收到ACK才回到发送状态

计算机网络笔记(更新中)_第30张图片

3.4.3 rdt 2.1

假设前提

底层信道可能产生位错误。

ACK/NAK也可能有错误。

新机制

  • ACK/NAK重传机制

    产生重复分组

  • 重复分组处理

    发送方:使用序列号

    接收方:丢弃重复分组

发送方与接收方的FSM

发送方

计算机网络笔记(更新中)_第31张图片

接收方
计算机网络笔记(更新中)_第32张图片

3.4.4 rdt 2.2

假设前提

底层信道可能产生位错误。

不使用NAK。

ACK可能有错误。

新机制

  • 新确认机制

    ACK显式加入序列号

    ACK告知最后一个正确接收的分组

  • 新重传机制

    收到重复的ACK即重传

发送方与接收方的FSM调整
计算机网络笔记(更新中)_第33张图片

3.4.4 rdt 3.0

假设前提

底层信道可能产生位错误或分组丢失。

仅使用ACK,且ACK也可能有错误。

新机制

  • 新重传机制

    发送方超时重传机制

发送方与接收方的FSM

发送方
计算机网络笔记(更新中)_第34张图片
接收方与rdt2.2的接收方相同。

3.4.5 rdt 总结

任何协议都不能完美地实现可靠。这取决于实际环境。

信道利用率

( Wsend * L / R ) / T

  • Wsend:窗口大小
  • R:信道带宽
  • T = RTT + L / R + L’ / R:整体所用时间
  • RTT:响应时间
  • L:发送方数据帧帧长
  • L’:接收方确认帧帧长

实现信道利用率最大,即信道利用率 ≥ 1。

rdt 3.0 信道利用率

忽略ACK大小,信道利用率为:

( L / R ) / ( RTT + L / R ) ≈ 0.00027

由于停等性质,利用率很低。

3.5 滑动窗口协议

3.5.1 滑动窗口协议原理

流水线

通过流水线机制使得信道利用率提高

  • 允许发送方在收到ACK之前连续发送多个分组
  • 需要更大的序列号范围
  • 发送方和/或接收方需要更大的存储空间以缓存分组

实现

  • 窗口

    允许使用的序列号范围

    窗口尺寸为N:最多有N个等待确认的消息

  • 滑动窗口

    随着协议的运行,窗口在序列号空间内向前滑动

  • 滑动窗口协议

    GBN

    SR

3.5.2 Go-Back-N 协议

发送方

  • 窗口尺寸为N,最多允许N个分组未确认
  • 仅有一个计时器,对最早发送并等待ACK的分组计时
  • 超时发生后,重传send_base到nextseqnum之间等待ACK的分组
  • send_base:等待确认ACK分组的序号
  • nextseqnum:下一个待发送分组的序号
    计算机网络笔记(更新中)_第35张图片

FSM计算机网络笔记(更新中)_第36张图片
接收方

  • ACK机制

    发送已正确接收的序号最大分组的ACK

    即累计确认

  • 乱序处理

    乱序到达的分组直接丢弃

    重新发送最后确认分组的ACK

FSM
计算机网络笔记(更新中)_第37张图片
GBN示例
计算机网络笔记(更新中)_第38张图片
信道利用率

( Wsend * L / R ) / T
= ( Wsend * L / R ) / ( RTT + L / R )
= ( Wsend * L / R ) / ( 2 * dprop + L / R )

窗口尺寸

若使信道利用率最大,则

( Wsend * L / R ) / ( 2 * dprop + L / R ) ≥ 1

Wsend( 2 * dprop * R + L ) / L

序号位数

≥ *log2 ( Wsend + 1 )

3.5.3 Selective Repeat 协议

特点

缓存不必要重传的分组,为每个分组设置计时器。

接收方/发送方窗口

计算机网络笔记(更新中)_第39张图片
发送方

  • 收到数据来自上层

    如果序号在发送窗口内 → 发送该分组

  • 超时

    重传其超时分组

  • 收到ACK

    序号在窗口内 → 标记为已接收ACK

    如果序号等于send_base → 向前滑动至未接收确认ACK的分组

接收方

  • 接收到分组

    • 接收分组序号在[rcv_base, rcv_base + N - 1]内

      没收到过的分组 → 缓存

      序号等于rcv_base → 将所有收到的分组按序向上交付,直到有没收到的按序分组,窗口向前滑动

    • 接收分组序号在[rcv_base - N, rcv_base - 1]内

      发送对应的ACK

      这是必要的,否则发送方窗口可能因未收到对应的ACK,而无法向前滑动,无法同步。

  • 其他情况

    忽略

SR示例
计算机网络笔记(更新中)_第40张图片

所有可靠数据传输协议满足:

Wsend + Wrecv ≤ 2 k

  • 停等: Ws = Wr = 1,k = 1
  • GBN:Ws ≤ 2 k-1,Wr = 1,k ≤ 7
  • SR:Ws = Wr ≤ 2 k-1,k ≤ 7

实际应用中通过假定某序号x的最大存活时间保证该序号可重新使用。

TCP的存活时间设置为3min。

3.6 TCP 协议

3.6.1 协议概述

1、特点

  • 点对点

    一个发送端(进程),一个接收端(进程)

  • 可靠、按序的字节流

  • 机制

    流水线机制

    拥塞机制 → 网络

    流量控制 → 接收方

  • 发送/接收方具有缓存

  • 全双工

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

  • 面向连接

    通信双方发送数据前必须建立连接

    只在通信方两端维护连接状态

  • 在IP协议提供的不可靠服务基础上实现可靠数据传输服务

2、TCP段格式
计算机网络笔记(更新中)_第41张图片

  • 序号

    该报文段的首字节在字节流中的编号。

    TCP建立连接时,双方随机选择序号开始(相对序号为0)。

  • ACK确认号

    希望收到的下一字节的序号。

    累计确认,乱序到达分组的处理由实现者决定(通常将其缓存)。

  • 标志段

    • URG:紧急数据
    • ACK:确认标志
    • PSH:推出标志(常用于第三次握手时)
    • RST:复位标志
    • SYN:建立连接(握手)标志
    • FIN:关闭连接(挥手)标志
  • 选项字段

    协商MSS(最大报文长度,单位为B)

    MSS = MTU(最大链路层帧长) - IP首部长度 - TCP首部长度

    时间戳等

3.6.2 TCP 可靠数据传输

  • 流水线机制

  • TCP使用单一重传计时器

  • 累计确认

  • 触发重传的事件

    超时

    重复ACK

超时

超时时间 = EstimatedRTT + 4 * DevRTT

EstimatedRTT = (1 - α) * EstimatedRTT + α * SampleRTT

DevRTT = (1-β) * DevRTT + β * |SampleRTT - EstimatedRTT |

经典值
α = 0.125
β = 0.25

初始超时时间为 1s

发送方事件与响应

  • 开始发送数据

    开启计时器

    设置初始超时时间

    nextseqnum += len(data)

  • 超时

    重传引起超时的段

    重启计时器

  • 收到ACK

    如果ACK序号n > send_base

    • 更新:send_base = n
    • 如果在[base, n]之间还有没收到ACK的段,重启计时器

计算机网络笔记(更新中)_第42张图片
ACK产生机制

事件 接收方动作
期望序号报文段到达,且之前的均已确认 延迟ACK,最多等待500ms,如果下一个按序报文段未到达,发送对应ACK
期望序号报文段到达,另一按序报文段在等待ACK 立即发送该ACK,确认二者均到达
间隔中的报文段到达 若该报文段位于间隔中序号小的一端,立即发送ACK
比期望序号大的报文段到达 立即发送冗余ACK

快速重传机制

  • 前提

    计时器每发生超时,超时时间将加倍,因此确认超时的开销将变大。

  • 发生条件

    收到 3个冗余ACK

  • 具体动作

// 伪代码

收到ACK,确认号为y;

if y > send_base :

    send_base = y;
    
    if 存在未确认的已发送报文段 :
        
        启动计时器;

else :

    y的冗余ACK数 + 1;

    if y的冗余ACK数为3 :
        
        重传具有序号y的报文段;
        
        

3.6.3 TCP 流量控制

接收窗口

TCP连接为全双工,发送方与接收方均有缓存。

窗口大小

RevBuffer ≥ RevWindow = LastByteRcvd - LastByteRead
RevWindow:接收窗口中的可用空间
LastByteRcvd:已缓存的最后一个字节
LastByteRead:已读入上层的最后一个字节

如果此时RevWindow等于0,发送方继续发送1B的报文段。

3.6.4 TCP 连接管理

连接建立

三次握手

  • SYN段SYNACK段占1字节,双方发送序号相对从1开始,实际上是随机选择从某个序号开始。

  • 当第三次握手结束后,发送方立刻发送PSH段,即通知接收方开始接收数据,并开始使用流水线机制。

计算机网络笔记(更新中)_第43张图片
连接关闭

四次挥手
计算机网络笔记(更新中)_第44张图片
客户端流程
在这里插入图片描述
服务端流程
在这里插入图片描述

3.6.4 TCP 拥塞控制

拥塞表现

分组丢失

分组延迟过大

拥塞原理分析

· 场景1

仅有一个路由器,但它具有无限缓存
计算机网络笔记(更新中)_第45张图片
场景1可知拥塞时分组延迟大。

· 场景2

仅有一个路由器,且缓存有限,存在重传事件
计算机网络笔记(更新中)_第46张图片
· 场景3

有多个路由器,但存在超时/重传事件
计算机网络笔记(更新中)_第47张图片场景2和场景3需要更多的重传,造成资源浪费。

拥塞控制方法

  • TCP采用端到端拥塞控制

    端系统通过观察判断

  • 网络辅助拥塞控制

    路由器显式地反馈

网络辅助拥塞控制实例:ATM ABR

  • ABR — available bit rate

    “弹性服务”

    网络正常时,使用可用带宽

    网络拥塞(overloaded)时,将发送速率降低到最低保障速率

  • RM cells — resource management cells

    从发送方发送,由路径上的交换机进行网络辅助

    交换机设置RM cell位:NI表示速率不许增长,CI指示拥塞

    最后由接收方返回给发送方

计算机网络笔记(更新中)_第48张图片

  • RM cell有显式的速率ER字段:两个字节

    拥塞的交换机可以降低ER

    发送方通过ER值获知路径支持的最小速率

  • data cell具有EFCI位:拥塞的交换机将其设为1

    如果RM cell前面的data cellEFCI位被设为1,接收方将在返回的RM cell中置CI

TCP 拥塞控制原理

rate ≈ cwin / RTT B/sec
cwin = min{ 拥塞窗口,接收窗口 } = 发送窗口 ≥ LastByteSent - LastByteAcked

cwin 是一个反映网络拥塞程度的值

感知网络拥塞

loss事件 = 超时3个冗余ACK

调整发送速率

AIMD 、SS

慢启动 SS

  • TCP建立连接,cwin初始为1MSS
  • cwin的值按指数增长,即每RTT,cwin的值翻倍,直到到达阈值Threshold

加性增乘性减 AIMD

  • 每RTT,cwin的值增加1MSS
  • 发生loss事件时,阈值Threshold即为当前cwin的1/2
  • 发生超时事件时,cwin = 1,进入SS阶段
  • 发生3个冗余ACK事件时,cwin = cwin / 2,仍处于AIMD阶段

该处理方式属于TCP Tahoe版本,Tahoe版本和Reno版本对比图如下。
计算机网络笔记(更新中)_第49张图片

3.6.5 TCP 性能分析

平均吞吐率

0.75 Maxcwin / RTT

Maxcwincwin在发生loss事件时的值。

公平性

  • 单个TCP连接对应单个目标进程时,是公平的
  • 存在UDP或多个TCP连接对应单个目标进程时,是不公平的

第4章 网络层

4.1 网络层概述

4.1.1 核心功能

  • 转发
  • 路由
  • 连接建立

4.1.2 服务模型

虚电路网络

  • 连接服务

  • 为系列分组确定路径

    过程:连接建立

    实现方式:路由

  • 沿该路径传输分组

  • 传输结束拆除连接

  • 典型:ATM

ATM 服务种类 特点
CBR 电路仿真(速率不变)
VBR 速率可变
ABR 速率可用(具有最低保障)
UBR 速率不定

数据报网络

  • 无连接服务
  • 每个分组独立确定路径
  • 典型:Internet

4.2 网络层服务模型特点

4.2.1 虚电路网络

虚电路(VC)

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

特点

主机-主机的连接由网络核心实现。

通信过程

  1. 呼叫建立
  2. 数据传输
  3. 拆除呼叫

实现

  • 每个分组携带虚电路标识VCID

  • 网络设备维护每条经过它的虚电路的连接状态

  • 链路、网络设备资源面向虚电路进行预分配

  • 每条虚电路包括:

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

    虚电路标识,每段链路一个编号

    沿路每个网络设备,利用转发表记录经过的虚电路

    转发分组时,依据转发表改写/替换VCID

VC转发表格式

输入接口 输入VCID 输出接口 输出VCID
1 12 3 22

计算机网络笔记(更新中)_第50张图片

虚电路信令协议

用于VC的建立、维护、拆除
计算机网络笔记(更新中)_第51张图片

4.2.2 数据报网络

特点

  • 无连接
  • 每个分组携带目的地址
  • 基于路由算法,由协议实现构建各个转发表
  • 转发表按分组的目的地址确定本路由器如何转发分组

数据报转发表

  • 采用聚合转发表
  • 使用最长前缀匹配优先原则

你可能感兴趣的:(CN)