一、相关概念
- (1)计算机网络:
- a)从构成来看,由节点和边组成的图。
节点包括 主机节点(端系统end system/host,方框表示)、数据交换节点(路由器交换机等,用圆形表示)
边称为链路,包括 接入网络链路,主干链路(数据交换节点间的边)
协议:对等层的实体通讯过程中遵循的规范。包含格式(语法和语意)、时序、动作 - b)从服务角度来看,互联网是分布式应用及为其提供通信服务的基础设施
- a)从构成来看,由节点和边组成的图。
- (2)网络结构:网络边缘、核心、接入
网络边缘是指主机设备,其上面有分布式应用,是互联网存在的理由
接入即是将主机设备接入核心
主机通过核心与其他主机相连,核心主要是数据交换作用- a)网络边缘
TCP:面向连接的,两者做好准备,底层协议栈做好准备,分配资源等。面向连接是指仅仅是端系统维持连接状态;有连接则需要中间路径节点均知道。
UDP:无连接的,不可靠。 - b)网络核心:数据如何传输
电路交换:每个线路带宽分为若干片,为每个用户分配一个片(频分、时分),建立独占的线路连接,建立连接后即使不传输数据也会占用,浪费资源。
分组交换:使用全部线路带宽,通信单位为分组packet,发送一个才进行通讯,资源共享。交换节点采用存储转发方式。本质上仍然是划分时间片的方式,只不过这种划分是不确定的。可能出现排队和丢包
分组交换在突发性强(活跃时间短)的环境下能支持更多用户,虽然有概率传输的数据比线路带宽大,但中转节点引入缓存,在大概率下能快速传输,小概率下会缓存数据,仍能通过大概率的事件将其成功发送出去。
- a)网络边缘
服务访问点(SAP):下层服务提供者区分不同上层用户的信息
服务是下层在SAP上通过原语(提供服务的形式)向上层提供服务
SDU是上层提供的数据单元
通过层间接口需要加上接口控制信息(ICI)
在第n层时加上头部(n-header),变成n-PDU(协议数据单元)
(3)层次结构
应用层:网络应用
传输层:TCP、UDP;进程区分;完成报文之间的交互(提供可靠服务)
网络层:IP(转发协议);实现以分组为单位的端到端的传输。
链路层:网卡;在相邻两点之间传输以帧为单位的数据
物理层:将数据帧与物理信号之间转换
二、应用层
(1)原理
a)标识和寻址
主机IP、TCP还是UDP、端口号;从进程角度来看,一个进程可用IP+port(端节点,end point)标识
b)如何使用传输层的服务:地点和形式
穿过层间接口的必要三个信息:发的什么,发给谁,谁发的;再进行封装。
每次传输都需要携带这三个信息比较繁琐,数据本身是经常变化,而两个进程会话通常持续一段时间,为统一管理以及减少穿过层间接口的数据量,引入Socket(用某个代号表示通信的双方或单方)
对TCP而言为4元组(源IP,源port,目标IP,目标port) 唯一指定了一个会话关系 ,由本地操作系统管理表项;
对UDP而言为2元组(源IP,源port),仅仅代表一个端节点;
c)根据报文执行相应的动作:动作(应用层协议)
(2)Web和HTTP:超文本传输协议
Web网页本身是一个对象,包含基本的HTML文件(居中等格式控制),内部嵌入很多对象(嵌入的为对象的链接,而非对象本身,可通过URL(唯一标识)来访问任何一个对象)
HTTP使用TCP,本身是无状态服务器,通过Cookies补丁将其变为有状态的。
流水线方式持久HTTP:所有请求依次发送;而非等待一个请求相应后再发另一个请求(非流水线)
TCP不提供边界服务,需要上层HTTP协议自己维护
加入本地缓存可以加快访问速度、减轻网络负担,减轻服务器负担。为解决本地缓存与远端服务器一致性问题,每次访问本地缓存时,其会加入If-modified-since: < date>字段访问远端服务器,如果缓存中的对象是最新的,就不需要发送对象。
(3)FTP:文件传输协议
天然为有状态的协议
控制连接与数据连接分开,当控制连接(port 21)建立后,服务器主动向客户端发送建立数据连接请求(port 20,数据传输通过此连接完成)
(4)EMail:服务器守候在port 25
aa)用户代理发给邮件服务器(SMTP);
bb)邮件服务器放入发送队列,发给目标邮件服务器(SMTP);
cc)目标邮件服务器将其放入邮箱中,用户代理再从邮箱中拉取邮件(POP3);
原本要求邮件内容均为ASCII范围
(5)DNS
DNS完成从域名到IP地址的转换,一般是给其他应用使用的
端口:运行在UDP的port 53
(6)TCP套接字编程
地点:层间接口的SAP(Socket)上;方式:Socket API,字节流形式
Sockaddr_in数据结构(代表一个端节点):
成员变量 | 作用 |
---|---|
sin_family | 地址簇,表示使用TCP/IP还是IPS通信 |
sin_port | 端口号 |
sin_addr | IP地址 |
sin_zero[8] | 对齐作用,有些协议IP地址比较长,TCP只用sin_addr即可 |
hostent数据结构(作为域名解析函数的参数使用,给定主机域名获得IP地址):
成员变量 | 作用 |
---|---|
*h_name | 主机域名 |
**h_aliases | 主机一系列别名 |
h_length | 地址长度 |
*h_addr_list | IP地址列表 |
注意:客户端不需要显式bind的(操作系统隐式执行,使用哪个端口无所谓);服务器必须显式bind,因为需要知道其监听在哪个端口等待请求。
C函数中htons((u_short)port)将其变为网络次序,大端/小端
(7)UDP编程
数据可能乱序或丢失
在发送每个报文中需要明确指明对方IP和端口
接收时,也需要知道是谁发给我的(引用型参数)
提供数据报形式,在IP中也叫数据报,注意区分
三、传输层
向上层提供的服务:远程进程到进程的以报文为单位的逻辑通信
将报文分为报文段
(1)多路复用和解复用:本质上是引入端口号解决,但使用Socket使得层间传输信息最少
源端口和目标端口用于封装TCP的头部信息,TCP往IP层提交时还需要给出源IP和目标IP
解析时也是执行对应过程,有了这四个信息就可以确定Socket值
UDP中只需要两个值即可确定,即使是不同主机发送的信息,只要目标IP和目标端口一样,都发给同一个进程
- (2)可靠数据传输RDT,下面为其逻辑递进过程
- package,在校验和出错时,发送方重新传输
- ACK/NAK反馈也可能出错,对package加上序号进行标识,若接收到的未知的反馈,则重新将原package传输一次,即使这个反馈是ACK,由于加了序号,接收方可以辨认出此次是重复传输,直接丢弃即可。两个序号(0,1)即可
- 去掉NAK,对ACK编号,对当前package的反向确认,使用前一个p的正向确认代表(取模的前一个)
- p可能在传输过程中丢失,发送方引入超时重传机制
- 流水线式传输,即短时间内发送多个package。按接收窗口是否>1,分为两种方式:GBN和SR。
a)GBN的接收窗口为1,后面的package先到时不会接收,返回的ack中为当前需要的package号,表示该号之前的均以收到,因此其确认号具有累计作用。只有一个超时定时器,超时后将发送窗口的所有数据重传。
b)SR的接收窗口大于1,后面的package先到,满足接收窗口时会接收,并在ack中返回该package序号;有若干个超时定时器,哪个超时重传哪个。
发送缓冲区:已发送但未得到确认的分组
接收窗口=接收缓冲区,接收方设置缓冲区的原因是:接收方接收的速度可能与发送方不一致
(3) TCP协议
TCP中的序号代表body部分第一个字节在整个字节流中的偏移量。(初始序号一般不为0,这是为了防止滞留在网络中的旧的连接对新的连接造成影响,双方协商确认)
其可靠数据传输结合了GBN和SR两种方法。
确认号具有累计作用,表示期待其传输的字节序号及之后,该号之前的已经收到(不包含该序号)。
超时定时器时间设置:移动平均值+4*移动类似方差
只设置一个超时定时器(类似go back n),超时定时器到时只发送最老的段(类似swich)。
快速重传:在超时定时器到时之前,收到该段三个冗余确认,则直接重传。
流量控制:接收方将其接收缓冲区的剩余字节数反馈给发送方,发送方保证发送的字节数不超过该值。实际中是通过接收窗口实现(收到的ACK包含此信息)。需要注意的是,即使接收方的实际接收为0,发送方也要认为是1,以便于接收后续的ACK,捕捉接收方变化情况。
TCP三次握手,第三次握手通常跟第一次数据传递结合在一起
(4)拥塞控制:在不造成网络拥塞前提下,尽量提高发送速率
拥塞时,网络延时大,有效输出少,重传了很多没有必要的数据,加速网络变化。甚至发生死锁现象。
ATM异步传输网络,利用网络核心提供的信息做拥塞控制。
(5)TCP端到端的拥塞控制
如何检测:
某些段超时:直接被中间路由器丢弃,此时路由器会给出超时反馈。虽然有可能是因校验和出错被丢弃,但这种概率比较小。
三个冗余ACK:说明发出的段是乱序到达,可能是轻微拥塞
四、网络层
4.1数据平面
(1)网络层协议在每个路由器和主机中,每个路由器会检查经过其段的IP地址
每个数据段到路由器时会进行解封装,选择路径,封装后传送到下一个路由器
路由:全局路径。更粗糙一些,例如从北京到上海再到伦敦,而北京到上海有多条路可以选择。
转发:在数据交换节点从哪个端口进入后从哪个端口出,类似局部路径。
IP协议根据路由表做转发。网络层的连接体现在端主机和路径上的所有路由器。而TCP/UDP仅仅体现在端系统。
服务模型:向上层提供服务的指标等于特定值时的称呼。
路由表是分布式计算出来,路由表交给路由器的网络层
基于目标的转发:仅仅依据目标的IP地址
ICMP信令协议,ping等程序实际上就是发送ICMP段,是 IP 协议的重要补充,主要要来检测网络连接;
upper layer决定给上层的TCP还是UDP或其他协议
(2)分片与重组
各网络的MTU(最大传输字节数)可能不一致,因此需要分片,分完的片到目标主机才进行重组
子网:高位IP相同,内部不需要借助路由器互相可达(可借助交换机)
路由过程是以网络为单位进行转发,使用32位ip代价太大。
ABC类网络都是单拨地址。A,B,C类分别使用1,2,3个字节代表网络号,这种方式不太灵活。
(2.1)无类间路由,使用子网掩码来区分网络号和主机号,子网掩码为1代表网络号,为0代表主机号。
32位全0代表本机地址,全1代表广播地址
路由聚集:减少路由通告,路由表项,计算的代价。允许有空洞,这会造成匹配时多项符合要求,以最长匹配长度为准。
(2.2)网络地址转换,10.x.x.x代表内网地址。从内网地址到外网地址需要路由器进行转换,该路由器需要记录一些信息,并使用端口号来对应内网地址和端口两个信息,从而可以转换回来。
4.2 控制平面
传统算法:只匹配目标IP,动作只有转发
通用匹配(SDN):可以匹配多项,有多种动作
路由信息计算都是以子网为单位。
链路状态算法:最小生成树算法
距离矢量算法:bellman-fold算法
将网络分为两个层面:
自治区域内网关协议:自治区域内做了路由聚集,使得自治区域间的点数量大幅减小。
自治区域间
五、链路层
检错和纠错
网络层实际的路由是以子网为单位,因此其可以到达目标子网,在目标子网内部如何到目标主机则由链路层完成。
因此其主要功能:路由节点转到另一个路由节点,主机到路由节点的相互传输
- 两种形式:
- 点到点连接:一般用于广域网
- 多点连接:发送给谁,同时发送的冲突问题。一般用在局域网
链路层的PDU:帧
网卡上实现了链路层和相应物理层的功能,其MAC地址固定
CRC校验:要保护的范围为D位,发送方数据后面需要加r位冗余位(EDC),使得可以被生成多项式整除(r+1位)。
能够检查出所有数量<=r位bit的错误,对高于r个的错误检查不出的概率也较小
MAP:比较MAC地址,两点或多点同时发送会出现冲突。
-
共享方式:
-
(1)划分信道方式:
随机存取的方式
-
(2)随机访问
-
算法如下
0.时域ALOHA:时间同步,时间分成时间段,只有在时间段的开始处才能发送帧,发送冲突时,下一次发送概率为p 1.CSMA:局部检测方式减少冲突,当前有主机发送时则不发送,发送前进行载波侦听。 受传送距离影响,仍有可能发生冲突 2.CSMA/CD:边说边听,当冲突发生时,立即停止对当前帧的发送。在有形的介质检测振幅等中容易实现。 以太网使用该方式。检测到冲突时,强化冲突信号,以确保让其他节点检测到冲突,防止冲突时间非常短时信号强度弱,让其他节点误以为没有冲突发生。 重发:二进制指数退避算法 3.CSMA/CA:冲突避免,在WLAN中使用,无线开放环境传播信号衰减很快。只在发送前检测,信道忙时随机选一个值,在信道空闲时过一个周期减一,减为0时发送。 需要接收方给出ACK信号,ACK信号等待时间短。 预约避免冲突,可选项,一般发送长帧时使用
-
(3)轮转方式
-
IP地址是分层的,MAC地址是平面的。在子网内部进行标识。
为什么不用一个地址?
分离可以解耦MAC地址和IP地址的关系,链路层上还可以支持不同的协议,不一定是IP协议。如果只用一个地址,必须得触及网络层,而链路层其实就可以做出一定区分。
每一跳都需要将IP地址转换为MAC地址
目标MAC地址不是本机或者广播地址时,设置为混杂模式也会接受,主要作用就是侦听,抓包
交换机是一个在链路层工作的存储转发设备,通过MAC地址区分发送端口,转发之前采用CSMA/CD协议先侦听。
路由器是工作在网络层的存储转发设备。
注意:
LAN中 不碰=成功,的条件为帧的传播时间>=2t(t表示子网内最远两个站点传播时间)
因此帧比较短时,会有填充码
六、物理层
manchester编码
DHCP是应用进程,其报文封装在UDP的数据报中。主机进入一个子网,进行广播得到DHCP服务器的响应后获得IP地址。
对称密钥加密:加密的K和解密的K一样
UDP校验和传输的为:和的反码,这样校验时,和+反码=全1
参考
中科大郑烇老师B站课程: link