概述
数据交换方式
- 电路交换 -电路直连
- 报文交换 -整个报文转发
- 分组交换 -报文分组转发
网络类别
- 广域网 WAN
- 城域网 MAN
- 局域网 LAN
- 个人区域网 PAN
性能指标
速率
b/s
比特每秒或bit/s,bps
kb/s,Mb/s
100M以太网指100Mb/s
带宽
通信线路传输数据的能力 “最高数据率”
b/s
Mb/s
吞吐量
网络在实际表现中,单位时间内通过数据量的测量。100Mb/s带宽 实际可能只有70Mb/s
时延
数据从一端到另一端所需时间
- 发送时延 从发送数据帧的第一个比特算起到该帧的最后一个比特完毕所需时间 发送时延=(数据帧长度b) / 发送速率 (b/s)
- 传播时延 电磁波在信道中传播一定的距离需要花费的时间 传播时延= 信道长度 (m)/电磁波在信道上的传播速率(m/s)
- 处理时延 主机或路由器在收到分组时分析首部进行差错检验查找适当路由等花费时间
- 排队时延 分组在路由器等设备的输入队列和输出队列等待时间
时延带宽积
时延带宽积=传播时延*带宽 表示一段带宽(用时间表示)内充满比特的数量
往返时间RTT
从发送数据到收到接收方的确认时间
网络体系结构
五层结构知识为了介绍原理,实际应用是tcp/ip OSI参考模型把对等层次之间的数据单位称为该层的协议数据单元PDU
TCP/IP体系结构
路由器最高只使用到了网际层
物理层
信号
- 模拟信号
- 数字信号
信道
- 单向通信 单工
- 双向交替通信 半双工
- 双向同时通信 全双工
常用编码方式
信道的极限信息传输速率符合香农公式
数据链路层
数据链路层协议数据单元 桢
点对点协议PPP
接收方每收到一个桢就进行CRC校验,校验正确就收下,错误就丢弃。
网络层
网际协议IP
IP是TCP/IP体系中两个最主要的协议之一,IP配套使用的还有地址解析协议ARP,网际控制报文协议ICMP 网际组管理协议IGMP 。IP使用ARP,ICMP/IGMP使用IP
- 物理层使用的中间设备叫转发器
- 数据链路层使用的中间设备叫网桥或桥接器
- 网络层使用的中间设备叫路由器
- 网络层以上使用的中间设备叫网关
运输层
用户数据报协议UDP User Datagram Protocol 传输控制协议 TCP Transmission Control Protocol
UDP
- 无连接
- 使用尽最大努力交付
- 面向报文 对于应用层交下来的报文不合并也不拆分,添加首部之后向下交付IP层
- 没有拥塞控制
- 支持一对一一对多多对一多对多交互通信
- 协议报文首部开销小,只有8字节。TCP20字节
TCP
- 面向连接的运输层协议,必须对连接进行建立和释放
- 每一个连接只能有两个端点
- 提供可靠交付 可靠:无差错不丢失不重复按序到达
- 全双工通信 使用两端的发送缓存和接受缓存实现
- 面向字节流 不像UDP应用交付一个报文。流指的是进程流入或者流出的字节序列。
tcp的连接
套接字socket及为tcp连接的端点。根据[RFC 793]定义 IP:端口号
即为套接字。
工作方式
无差错报文等待上一个报文被确认才发送下一个报文。 有差错时重传,如果未收到确认会超时重传。 接收端在收到重复报文时丢弃重复报文不向上层交付并向发送端发送确认 这个叫自动重传请求 ARQ automatic repeat reQuest
连续ARQ滑动窗口
发送缓冲区发送端会有一个自定义大小的滑动窗口,窗口内的数据可以未经确认就发送。窗口内任一位置都可能收到接收方确认,但只有当最久的被确认后窗口才可以前移。
tcp报文超时重传
RTT
=报文段的往返时间(发出到收到确认)
RTTs
=加权平均往返时间,每次发送动态更新
第一次RTTs=RTT
,之后
新的 RTTs = (1-α) * 旧的RTTs + α * 新的RTT
超时重传时间 RTO=RTTs+4*RTTd
RTTd=RTT
偏差加权平均值
第一次RTTd=RTT/2
,
新的 RTTd = (1-β) * 旧的RTTd + β * | RTTs - 新的RTT |
因为发送端A无法确定ACK是对第一次报文m的ACK还是重传报文m‘的ACK。这样会影响对RTT的计算。
所以报文段每重传一次就把RTO = 2 * 旧的RTO,当不再发生重传的时候再使用RTT动态计算。
选择确认
当接收方B接受到不连续的TCP报文段时,如果想只给发送方A发送未接受段确认,需要发送边界。这是需要使用SACK。SACK需要在TCP连接建立是双方确定好。受TCP首部40字节限制,只能确认8个边界。8*4字节+SACK+占用字节
TCP流量控制
接受方B在ACK时会携带可接受窗口长度。如果A收到B的窗口长度为0,会导致死锁,所以启动计时器,用来发送探测报文段。 提升传输效率的Nagle算法:A先把第一个字节发送给B,当收到确认时再把剩下的字节组装报文发送。并且,当缓存数据已经达到窗口的一半或报文段最大长度,立即发送。 如果接收方一次只能消费一个字节数据,则可以让接收方等待,或有足够的窗口容纳一个报文时再ACK
拥塞控制
如果同一时间超过网络可用资源的大量数据涌入网络会导致整个网络拥塞。 拥塞控制就是防止过多的数据注入的网络中,这样可以使网络中的路由器或链路不至于过载。 相对于TCP的端到端流量控制,拥塞控制是一个全局性的过程。 拥塞窗口:和发送窗口不一样的地方在于拥塞窗口大小取决于网络拥塞程度。发送方要让发送窗口等于或小于拥塞窗口。
拥塞控制方法:
- 慢开始和拥塞避免。慢开始是使拥塞窗口逐渐的加倍增长;拥塞避免是使拥塞窗口逐渐的加一增长。为了防止拥塞窗口增长过大引起网络拥塞,需要一个慢开始门限,小于门限时使用满开始,大于门限时使用拥塞避免。
- 快重传和快恢复。接收方接受到失序报文段时立刻进行“重复确认”(重复确认名词理解在计算机网络第六版第220页)以使发送方及早知道有报文没有到达接收方。快恢复是指当接收方连续收到三个“重复确认”时,把慢开始门限减半,预防网络发生拥塞。并把拥塞窗口设置为慢开始门限一半的值,然后开始拥塞避免算法。
随机早期检测RED
路由器的分组丢弃策略。路由器的队列是一个FIFO队列,当队列已满的时候后来的分组报文都将被丢弃,这种叫尾部丢弃策略。因为会导致一连串的分组丢失,会使多个发送发进行重传并进入满开始策略,这叫全局同步。因此使用RED(Random Early Detection)随机早期检测措施。给队列设置两个门限,通常最大门限是最小门限的两倍。当小于最小门限时不丢弃,当小于最大门限时按照概率p(从0到1的线性增长)丢弃。大于门限把新到达的丢弃。
TCP的运输连接管理
tcp是面向连接传送tcp报文的协议。经历三个阶段 连接建立,数据传送,连接释放。
连接建立
经历三次握手。主动发起连接叫客户端,被动等待连接叫服务端。过程
- 最初A和B的TCP进程都处于
CLOSED
状态,随后A主动打开连接,B被动打开连接。 - B的TCP进程先创建传输控制块TCB准备接受连接,然后进程进入
LISTEN
状态。 - A的TCP进程也是先创建TCB向B发送请求报文段
同步位SYN=1 ,初始序号seq=x
。然后进程进入SYN-SENT
状态。(TCP规定SYN报文不能携带数据,但消耗一个序号) - B收到报文后向A发送确认
同步位SYN=1 ACK位ACK=1 确认号ack=x+1 序列号seq=y
,然后进程进入SYN-RCVD
状态 - A收到确认后再向B发送确认,
ACK=1 seq=x+1 ack=y+1
。此时,这个报文段叫ACK报文段。TCP规定ACK报文段可以携带数据,但如果不携带数据则不消耗序列号。连接建立,A进程进入ESTABLISHED
(已建立连接)状态。 - B收到A确认,进入
ESTABLISHED
状态。
为什么要有三次握手:防止已失效的连接请求报文段又传送到了B。所谓的已失效报文段是指A发起连接请求,该请求未收到确认。如果没有三次握手,然后A又重传连接建立。但是如果A发出的第一个请求没有丢失 而是滞留了延误到达B,B认为A发起连接于是向A发送确认报文段并建立连接,然后浪费资源等待A发送数据,但此时A并无法建立连接也不会发送数据。所以需要第三次握手确认。
连接释放
四次握手,A主动释放连接
- A和B都处于
ESTABLISHED
状态,A先向B发送连接释放报文段 终止控制位 FIN=1 seq=u (u=A前面已经发送过报文最后一个字节序号+1) 并停止发送数据。进入FIN-WAIT-1
- B发送确认
ACK=1 ack=u+1 seq=v
(v=B前面已经发送过报文最后一个字节序号+1) ,进入CLOSE-WAIT
状态。此时TCP连接处于半关闭状态,A不再发送数据,B可以发送数据。 - A收到确认后进入
FIN-WAIT-2
状态,并等待B发送连接释放报文段。 - 若B已经没有要发送的数据,发送释放报文段
FIN=1 ACK=1 ack=u+1 seq=w
(半关闭状态B可能又发送了一些数据) ,并进入LAST-ACK
状态。 - A发送确认报文段,
ACK=1 seq=u+1 ack=w+1
,然后进入TIME-WAIT
状态。并经过时间等待计时器设置的时间 2MSL后自动进入CLOSED
状态。 - B收到确认进入
CLOSED
状态。
MSL:最长报文段寿命,RFC 793建议2分钟,也就是要经过2*2=4分钟A才释放。
A要等待计时器结束后才释放是因为,1,保证A发送的最后一个ACK报文段能够到达B。因为最后一个A发送给B的报文段有可能丢失,如果B没有收到A确认报文段会重传FIN+ACK连接关闭报文段,如果A再次收到FIN+ACK报文段会重置时间等待。2,A发送最后一个ACK后再经过2MSL基本可以确认本连接持续时间内所有报文段从网络中消失(或丢弃或已被消费),下一次新的连接不会出现旧的滞留报文段。
TCP有限状态机(了解)
除等待计时器外TCP还有一个保活计时器,假设A出故障无法释放连接,那么服务器就会等待两个小时,两个小时后每隔75分钟发送一个探测报文段,连续10个探测报文段无响应服务器关闭连接。
应用层
域名系统DNS
文件传输协议FTP,TFTP
远程终端协议TELNET
超文本传输协议HTTP
HTTP是面向事务的应用层协议:一系列的信息交换是一个不可分割的整体,要么所有的信息交换都完成,要么一次交换都不进行。 HTTP协议无状态。HTTP/1.1使用了持续连接。
简单邮件传输协议SMTP
邮件读取协议POP3和IMAP
动态主机配置协议DHCP
简单网络管理协议SNMP
应用网络通信
应用要进行网络通信需要经过 系统调用 和 应用编程接口 。现在TCP/IP协议软件已经驻留在操作系统中。unix系统提供系统调用的API 套接字接口。在套接字接口以上进程是受应用程序控制,套接字接口以下运输层协议受计算机操作系统控制。当应用进程要进行网络通信时,先发出socket系统调用请求操作系统创建一个套接字。操作系统返回一个套接字描述符(数字)来表示为其创建的各种系统资源。
socket系统调用
- 调用socket创建套接字。
- 当套接字被创建后端口号和ip地址是空的,调用bind指明套接字地址。在客户端也可以不用调用,系统会自动分配一个动态端口号。
- 服务器调用listen把套接字设置为被动的方式以便随时接受请求。UDP因为提供无连接服务,不调用listen。
- 服务器调用accept把客户端的请求提出出来并创建一个新的套接字和一个从属服务器进程。并把新的套接字交给从属服务器进程处理。
- 当客户端调用socket后,就调用connect与服务器进行连接。
- 双方调用send发送recv接收数据。