配套使用《计算机网络自顶向下法》与中国大学MOOC平台哈工大微课《计算机网络》。
文中图片侵删,转载需笔者口头同意。
2022.1.22 计网概述、传输层、应用层;
信源->发送设备->信道(易被噪声源干扰)->接收设备->信宿。
计算机网络是一个互连的、自治的计算机集合。
由交换节点(路由器或交换机)构成的网。
为进行网络中数据交换而建立的规则、标准或约定。
协议规定了通信实体之间所交换的信息的格式、意义、顺序、以及针对收到信息或发生的事件所采取的“动作”。
大部分为RFC文档,由IETF互联网工程任务组管理。
即数据率,或称数据传输速率或比特率,描述单位时间内传输信息量多少,是计算机网络中最重要的性能指标,单位:b/s或bps,kb/s等等。
时延带宽积 = 传播延迟 * 带宽,又称为以比特为单位的链路长度;
丢包率 = 丢包数/已发分组总数;
表示在发送端与接收端之间数据速率。
极简、自治、尽力服务模型、无状态路由器、分散控制。
TCP服务 | UDP服务 |
---|---|
面向连接:客户机/服务器进程需要建立连接 | 无连接 |
可靠的传输 | 不可靠的数据传输 |
流量控制:发送方不会发送速度过快,超过接收方处理能力 | 不提供 |
拥塞控制:当网络负载过重时能够限制发送方的发送速度 | 不提供 |
不提供时间/延迟保障 | 不提供 |
不提供最小宽带保障 | 不提供 |
Seheme://host:port/path
协议(可省略)/主机:端口号/路径
非持久性连接 | 持久性连接 |
---|---|
每个TCP连接最多允许传输一个对象 | 每个TCP连接允许传输多个对象 |
HTTP 1.0版本使用非持久性连接 | HTTP 1.1版本默认使用持久性连接 |
method + sp + URL + sp + version (请求行)
header field name+:+value(头部行)
......
header field name+:+value(头部行)
(空行)
Entity Body(数据体)
GET:请求数据;
POST:提交数据;
HEAD:请Server不要将所请求的对象放入相应消息中;
PUT:将消息体中的文件上传到URL字段所指定的路径;
DELETE:删除URL字段所指定的文件。
version + sp + status code(状态行)
header field name+:+value(头部行)
......
header field name+:+value(头部行)
(空行)
Entity Body(数据体)
某些网站为了辨别用户身份、进行session跟踪而存储再用户本地终端上的数据(通常经过加密),是架设在HTTP上的一个组件。
组成部分:
邮件服务器之间传递消息所使用的协议;
客户端:发送消息的服务器;
服务器:接收消息的服务器。
使用TCP进行email消息的可靠传输;
端口25;
传输过程的三个阶段:(1 握手(2 消息的传输(3 关闭;
采用命令/响应的模式:命令为ASCII文本,响应为状态代码和语句。
POP(Post Office Protocol):认证/授权(客服端<–>服务器)和下载;
IMAP(Internet Mail Access Protocol):更多功能,更加复杂,能够操纵服务器上存储的消息。
HTTP:163,QQ Mail等。
为运行再不同Host上的进程提供了一种逻辑通信机制。
可靠的、按序的交付服务(TCP)
不可靠的交付服务(UDP)
两种服务都不提供延迟和带宽方面的保障;
如果某层的一个协议对应直接上层的多个协议/实体,则需要复用/分用。
传输层依据头部信息将收到的Segment交给正确的Socket,即不同的进程。
从多个Socket接收数据,为每块数据封装上头部信息,生成Sgement,交给网络层。
利用(源端口号,目的端口号)构成的二元组进行标识。
利用(源IP地址,源端口号,目的IP地址,目的端口号)构成的四元组进行标识,一个客户机进程对应一个服务器进程。
source port #(源端口号) | dest port #(目的端口号) |
---|---|
length(UDP段的长度,包含头部) | checksum(校验和) |
Application data |
目的:检测UDP段在传输中是否发生错误;
发送方:
接收方:
差错检验的机制:校验和检验位错误;
解决机制:
接收方反馈控制信息:
ACK:接收方显式地告知发送方分组已正确接收;
NAK:接收方显式地告知发送方分组有错误;
发送方收到NAK后,重新分组;
基于这种重传机制的rdt协议称为ARQ协议;
两个状态,停—等协议:
两个状态:
状态转移:
状态动作:
snkpkt = make_pkt(data,checksum)
计算校验和并将数据打包;udt_send(sndpkt)
发送数据;udt_send(sndpkt)
进行数据重传;Receiver图示:
单一状态:
rdt_rcv(rcvpkt)&¬corrupt(rcvpkt)
通过计算校验和判断数据无错位rdt_rcv(rcvpkt)&&corrupt(rcvpkt)
数据有错位;extract(rcvpkt,data)
解析数据;deliver_data(data)
传递数据;分组丢失造成的后果:发送方一直等待下去;
解决机制:
性能极差,约1Gb链路1s传输33kb数据。
性能差原因:停等协议。
窗口:
滑动窗口:随着协议的运行,窗口在序列号空间内向前滑动;
滑动窗口协议:GBN,SR。
分组头部包含k-bit序列号;
窗口尺寸为N,最多允许N个分组未确认。
累计确认,ACK(n):确认到序列号n(包含n)的分组均已被正确接收;
为空中的分组设置计时器(timer);
超时Timeout(n)事件,重传序列号大于等于n,还为收到ACK的所有分组。
ACK机制:发送拥有最高序列号、已被正确接收的分组的ACK
乱序到达的分组:
解决了GBN协议中重复发送段数过多的问题;
接收方对每个分组单独确认:
发送方只重传那些没收到ACK的分组:
发送方窗口:
设置接收方窗口;
点对点:一个发送方,一个接收方;
可靠的、按序的字节流;
流水线机制:TCP拥塞控制和流量控制机制设置窗口尺寸;
发送方/接收方缓存;
全双工:同一连接中能够传输双向数据流;
面向连接:
通信双方在发送数据之前必须建立连接;
连接状态只能在连接的两端维护,在沿途节点中并不能维护状态;
TCP连接包括:两台主机上缓存、连接状态变量、socket等。
流量控制、拥塞控制机制。
基于RTT设置,过短造成不必要的重传,过长则对段丢失时间反应慢;
RTT的估算:
定时器超时时间设置:
测量RTT的变化值:SampleRTT与EstimatedRTT的差值:
$ DevRTT = (1 - β ) * DevRTT + β * | SampleRTT - EstimatedRTT | $(β的典型值:0.25)
定时器超过时间的设置: T i m e o u t I n t e r v a l = E s t i m a t e d R T T + 4 ∗ D e v R T T TimeoutInterval = EstimatedRTT + 4 * DevRTT TimeoutInterval=EstimatedRTT+4∗DevRTT
建立连接的内容:
初始化TCP的变量:
Client为发起者:Socket clientSocket = new Socket("hostname","port number");
Server等待客户连接请求:Socket connectionSocket = welcomeSocket.accept();
三次握手机制:
第一步:客户主机向服务器发送SYN报文段;
第二步:服务器向主机答复一个SYNACK报文段;
第三步:客户机收到SYNACK报文段,答复ACK报文段;
上层应用可能处理buffer中数据的速度慢于传输速度,造成数据溢出,将接收方的缓冲区淹没。
Receiver通过Segement的头部字段将RcvWindow告诉Sender;
Sender限制自己已经发送的但还未收到ACK的数据不超过接收方的空闲RcvWindow尺寸;
RcvWindow的计算:
定义一下变量:
由于TCP不允许已分配的缓存溢出,下式必须成立
$ LastByteRcvd - LastByteRead \leq RcvBuff $
故 $ RcvWindow = RcvBuff - [ LastByteRcvd - LastByteRead ] $
RcvWindow = 0 ,即缓存已满时:
非正式定于:太多发送主机发送了太多数据或者发送速度太快,以至于网络无法处理。
表现:
两个发送方与两个接收方共用一个路由器,带宽为R,缓存有限。 λ i n λ_{in} λin 表示senders发送速率, λ o u t λ{out} λout 表示receivers接受速率。 λ ’ i n λ’_{in} λ’in 表示senders发送和重传复合速率。
情况a:Sender能够通过某种机制获知路由器buffer信息,有空闲才进行传输, λ i n = λ o u t λ_{in} = λ_{out} λin=λout 。
情况b:没有机制,丢失后才重发, λ i n ′ > λ o u t λ'_{in} > λ_{out} λin′>λout 。进行重传会影响发送速率。
情况c:分组丢失和定时器超时都重发, λ i n ′ λ'_{in} λin′更大。
端到端的拥塞控制:
网络辅助的拥塞控制:
例:ATM中的”ABR拥塞控制“:
发送方在data cell中穿插RM cell,路径中的交换机设置RM cell 位,由接收方返回给发送方。
Sender通过调整滑动窗口大小CongWin来限制发送速率。
$ LastByTeSent - LastByteAcked \leq CongWin$
$ rate \approx \frac{CongWin}{RTT} Bytes/sec $
加性增,乘性减(AIMD):
慢启动(SS):
SS切换到AIMD模式:
Threshold = ? //初始化Threshold值
CongWin = 1 MSS //初始化CongWin大小
while(TCP connection)
{
//慢启动,进行指数型增长
while(No Packet Loss && CongWin < Threshold)
{
send CongWin TCP segments;
for each ACK increase CongWin by 1;
//每收到一个ACK信号CongWin便增加1
}
//加性增,线性增长
while(No Packet Loss)
{
send CongWin TCP segments;
for CongWin ACKs,increase CongWin by 1;
//每次增加1
}
Threshold = CongWin/2;
if(3 CupACKs) CongWin = Threshold;
if(timeout) CongWin = 1;
}