网络结构
数字用户线路DSL
DSL(数字用户线路,Digital Subscriber Line)是以铜质电话线为传输介质的传输技术组合,它包括HDSL、SDSL 、VDSL 、ADSL和RADSL等,一般称之为xDSL。它们主要的区别就是体现在信号传输速度和距离的不同以及上行速率和下行速率对称性的不同这两个方面。
ADSL是“非对称数字用户线路”,是一种通过现有普通电话线为家庭数据传输服务的技术。其中网络数据和电话数据都通过DSL传输
HFC混合光纤同轴电缆
非对阵结构,下行最高30Mbps,上行最高2Mbps 各个家庭共享电缆,通过电缆接入ISP(DSL是独占的)
ISP网络结构
数据交换
互联的路由网络通过数据交换从源主机到达目的主机,有点类似老式电话转接员
数据交换类型
-
电路交换
电话线的交换类型,属于独占的,即某一线路占用交换器别的线路就没法用了 解决办法就是多路复用, 思想就是ABC虽然共享某一线路,但是ABC传输的数据可以后续分辨出来
-
频分多路复用
经过调制后各个用户占用不同的频段
-
时分多路复用
将时间划分为一段段等长的帧,每个帧里面有n个序列号,不同用户使用特定序列号的帧,每个用户的消息按照周期出现
-
波分多路复用
根据光波长区分
-
- 报文交换 双方发送信息是一个个报文
- 分组交换
将报文拆分成若干个分组,再重组,会产生额外开销
事实证明分组交换速度快,延迟小
计算机网路性能概述
速率:指数据传输速率,单位为bps, kbps,Mbps, Gbps, 注意里面的b是bit, 如果是MBps是byte= 8bit 带宽:指信号的最高与最低频率之差(HZ),网络的带宽一般是指最高传输速率
- 延时:在分组交换中会产生四种延迟
- 传输延迟: 是指带宽限制下的传输时间d= L(bits) / R(bps), 类似于高速ETC缴费处理时间
- 传播延迟: 是指光速,物理限制下的传输时间 d= dis(m) / s(m/s),类似于高速开车时间
- 排队延迟:指数据到达缓冲区等待时间
分组丢包:队列缓冲区有限,队列已满再来数据就会被丢
吞吐量:表示发送端和接收端的传输速率。一般由联路上最慢那个决定
计算机体系结构
OI参考模型
- 物理层 物理实体作为介质的数据传输
- 数据链路层 负责节点-节点的数据传输,流量控制,差错控制等
- 网络层 负责主机之间的数据分组,交付。路由所在的就是这一层
- 传输层 负责端到端的数据传输,即进程间的传输。利用SAP寻址,确保报文交给正确的进程(端口)
- 会话层
- 表示层
- 应用层 网络应用,http,smtp等
由此可以知道,数据传输过程为,例如web数据传输(以五层模型为例)
- 用户首先通过http或者https协议请求某一个数据(应用层)。服务器通过TCP建立连接(传输层)并将请求数据发送到对应服务器端口。服务器的数据进一步经过封装发给路由(网络层)进行转发,转发的数据经过两端封装形成一个整体(数据链路)。该数据最后经过光缆传输(物理层),然后由用户再解析。
网络应用(应用层)
体系结构C/S,P2P,混合结构 C/S结构的典型就是WEB服务,特点就是7*24服务,由web服务器统一部署 P2P结构就是没有特定的服务器,大家都是服务器,端到端可以直接通讯,但是难于管理,因为结构复杂
web应用
对于使用http协议,服务器在80端口等待请求 使用https的,在443端口
http连接
连接的两种类型
- 非持久性连接 每个TCP最多传输一个对象,http1.0采用这个
- 持久性连接 可以传出多个对象,http1.1用这个
响应时间RTT:从客户端发一个很小的数据包到服务器返回的时间
http消息格式
-
请求消息例子
GET wisotop.de/test.html HTTP/1.1
-
响应消息例子
HTTP/1.1 200 OK
Server: Apache/2.0.49
Content-Language: de
Content-Type: text/html
User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/312.8
- method是
-
GET
“读取“一个资源。比如Get到一个html文件。反复读取不应该对访问的数据有副作用(幂等)。
-
POST
在页面里<form>标签会定义一个表单。点击其中的submit元素会发出一个POST请求让服务器做一件事
-
https流程
加密采用非对称加密
由客户端生成的随机数,用公钥加密,私钥解密
之后就利用这个随机数进行加密,公钥和私钥只是针对随机数进行加密传输用的
web缓存技术
在不访问服务器的前提下满足用户的请求,减少响应时间
浏览器会先向缓存服务器发送请求,如果缓存服务器有数据则直接反馈,否则向原始服务器发送请求 一般由ISP架设(例如电信) 保证缓存信息是最新的,要用条件性GET方法,就是只有当服务器数据更新了才返回对象
Email应用
SMTP协议
邮件服务器传递消息的协议
- 使用TCP进行消息的可靠传输
- 端口25
- 交互模式:命令(ASCII文本)和相应(状态代码和语句)。
SMTP交互过程
- 服务器首先发送通告,自己的信息
- 客户端确认
- 服务器回复,此时建立连接
- 客户端请求邮件发送
- 服务器确认sender
- 客户端说明发到哪里
- 服务器确认接收方OK
- 客户端准备传输数据
- 服务器告知,以 . 结尾
- 实际消息
- 实际消息
- 结束标志
- 服务器确认消息收到准备发送
- 客户机退出
- 服务器确认
POP3协议
POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,是TCP/IP协议族中的一员(默认端口是110)。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。
POP3协议允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件、标记已读等),不会反馈到服务器上,比如通过客户端收取了邮箱中的3封邮件并移动到其他文件夹,邮箱服务器上的这些邮件是没有同时被移动的 。
DNS应用
该应用是一种解析域名的应用,用于域名和IP地址映射解析,是网络的核心应用
在实际查询时,先访问本地域名服务器,如果没有再查询根服务器。一般每一个ISP有一个本地域名服务器。
Socket应用层API编程
Socket是网络应用层的API,面向TCP进行了封装
Socket抽象,在使用时一般先建立socket结构体,具体包括
- familiy地址族,常见有PF_INET , AF_INET
- service,例如socket_stream流式(TCP)
- 本地IP和端口
- 远程IP和端口
一般建立连接过程为
服务器
- socket
- bind: 绑定套接字本地地址,只针对服务器而言,用INADDR_ANY绑定任意地址(通配符),这样保证即使服务器有很多地址,客户端可以通过任意地址进行连接
- listen:也是仅服务器调用,仅用于流式套接字(TCP),因为UDP无连接
- accept:用该函数从请求队列取出排在最前面的客户请求,并创建一个新套接字返回进行通信
客户端
- socket
- connect: 只能客户端用,用来绑定客户端FD和远程服务器特定端口,并放入请求队列
传输层
传输层协议为不同进程提供通信的一种协议,是提供应用进程通信的协议。通信的基本单位是进程。
-
TCP拥有可靠的传输机制,包括拥塞控制,流量控制,可靠连接
-
UDP啥也不报保证
-
TCP和UDP都不保证延迟和带宽
TCP握手和挥手
最后要等待2msl(最长报文段寿命)是因为最后的ACK可能没有成功发到
可能最后的ACK消失了,耗时一个msl,这时候服务器重发FIN耗时一个msl,所以最多等2msl
UDP无连接协议
常用于流媒体,例如QQ视频,爱奇艺播放等,特点就是可以容忍丢包,可以有些许延迟。
UDP如果实现可靠传输需要在应用层加上某些机制
UDP错误校验
检测UDP是否在传输中发生错误,如位反转
- 发送方
- 每一段视为16bits
- 计算校验和
- 将'校验和'放到UDP的校验字段里面,然后接可以发送了
- 接收方
- 计算校验和
- 比对,如果一致就没有错误(也可能有错误),不一致肯定有错误
所以该方法有一定限制,不一定所有错误都会识别出来,比如两个位反转,校验和是一样的
上面两个是16位整数,过程是
先按位相加,有进位所以多出来一个1, 把多出来的1加到后面,然后全部取反就行了
可靠数据传输
RDT 1
RDT是在传输层实现可靠数据传输的缩写
首先假设底层传输可靠
这种情况下只需要保证数据正常接收发送就行
RDT 2.0
产生位错误的底层通道,需要校验位错误(比如校验和什么的),如果发生错误则重传
如何从错误中恢复?
- 确认机制(Acknowledgements, ACK): 接收方显式地告知发送方分组已正确接收
- NAK: 接收方显式地告知发送方分组有错误
- 发送方收到NAK后,重传分组
- 基于这种重传机制的rdt协议称为ARQ(Automatic Repeat reQuest)协议
RDT 2.1
用于发送方应对ACK,NAK错误,ACK和NAK由接收方发送。发送方需要校验ACK,NAK
又有一个问题,接收方怎么知道发送方这次新传过来的是新的报文段还是因为ack出错而重传的报文段呢?
显然我们需要区分,上一个报文段和当前的报文段,我们给报文段编写好序号就可以了,而且只需要0,1两个序号,一个表示上次的报文段,一个表示新接受的。
RDT 2.2
无NAK消息协议,只利用ACK确认
- 接收方通过ACK告知最后一个被正确接收的分组
- 在ACK消息中显式地加入被确认分组的序列号
- 发送方收到重复ACK之后,重传
这是因为当发送方某一次发送错误后,接收方返回的还是上一次正确接收的报文序列号,发送方得知当前发送的报文出错,故重传
RDT 3
如果信道既可能发生错误,也可能丢失分组,怎么办?
“校验和 + 序列号 + ACK + 重传”就不够用了
假设这时候ack不是错误而是直接丢了,那么发送方就会无限制的等着接收方的ack,同时接收方也会无限制的等着发送方的新报文
方法:发送方等待“合理”时间
- 如果没收到ACK,重传
- 如果分组或ACK只是延迟而不是丢了,重传会产生重复,序列号机制能够处理,
RDT3 效率很差!
TCP可靠数据传输
触发重传的事件
- 超时,需要设置定时器
- 收到重复ACK
第一个图好懂
第二个图序列号为92的段发生超时,重传
然后收到了两个ACK,更新base到120
接收方收到第二个重传的段,继续发送ACK 120
滑动窗口协议
流水线协议:允许在收到ACK之前连续发送多个分组,但是需要更大的序列号范围以分辨不同的报文组
-
窗口:允许使用的序列号范围
-
滑动窗口: 程序运行,窗口移动,允许的序列号数量变化
SR协议
窗口大小为4
- 首先发送4个包然后等待,因为窗口满了
- 收方首先受到pkg0,正确,接收方窗口移动1
- 再收到pkg1,继续移动1
- pkg2丢失,receiver什么也不做
- pkg3到达,正确,但是并没有发送(只发送ACK),而是缓存起来等pkg2
- 发送方收到ack0,发送pkg4(接收方继续缓存),窗口滑动1
- 收到ack1,滑动
- pkg2重发,此时接收方收到则将pkg2和缓存的pkg3,4,5一起发出
TCP流量控制
利用buffer缓冲区大小限制,缓冲区分为内核缓冲区和用户缓冲区
自己的项目环形缓冲区就是用户缓冲区,系统首先为每个tcp连接创建发送缓冲区和接受缓冲区(都是内核里),通过send和recv函数进行对内核缓冲区的读取操作
- Server 端的 socket 接收缓冲区未满,所以尽管 Server 不会 recv(),但依然能对 Client 发出的报文回复 ACK
- Server 端的 socket 接收缓冲区被填满了,向 Client 端通告零窗口(Zero Window)。Client 端待发送的数据开始累积在 socket 的发送缓冲区
- Client 端的 socket 的发送缓冲区满了,用户进程阻塞在 send() 上
网络层
主机之间的通信协议,一般是路由器之间的转发算法
IP协议
主要完成路由器转发之后的地址寻址规则
IP数据报
其中首部包括
- 版本号:4位。4->IPv4 或者 6->IPv6
- 首部长度:4位。
- 服务类型TOS:8位
- 总长度:16位
- 生存时间TTL:8位。指跳步数,转发一次TTL减1
- 协议字段:指TCP或者其他协议
- 首部校验
- 源IP和目的地IP:各32位
IP分片
不同链路能传递的数据长度不一样
- 标识(ID)字段:16位。利用计数器,每次产生新分组则加一
- 标志位:3位。表示禁止分片,允许分片等
- 片偏移字段:13位。分组的相对偏移量
IP编址
高位是网络号,低位时主机号
IP子网是具有相同网络号的设备接口,不跨越路由器。
IP地址分类:
- A类:0.0.0.0-127.255.255.255
- B类:128.0.0.0-191.255.255.255
- C类:192.0.0.0-223.255.255.255
- D类:224.0.0.0-239.255.255.255
CIDR路由协议
无类域网络,消除ABCD的地址界限
地址格式a.b.c.d/x,其中x为前缀长度
例如 11001000 00010111 00010000 00000000
如果一个IP地址的前N位与一个CIDR地址块的前缀是相同的话,那么就说这个地址属于这个CIDR地址块,也可以说是与CIDR地址块的前缀匹配。前缀越短就能匹配越多的地址,越长就匹配得越少。
DHCP协议
动态主机配置协议,用于为主机分配IP地址
- 动态获取
- 即插即用
发现过程
- 主机广播“DHCP discover”
- DHCP服务器利用 “DHCP offer”相应
- 主机请求IP地址
- DHCP确认分配
DHCP协议在应用层实现
路由算法
路由算法实现确定去往目的地的最佳路径
转发表确定本路路由器如何转发
链路状态法:利用Dijkstra算法确定路径,略
距离向量路由算法:根据Bellman方程
数据链路层
负责通过一条链路从一个节点向另一个物理链路层直接相邻的相邻节点传送数据
- 组帧 封装数据报,加头部和尾部
- 链路接入
- 流量控制
- 差错纠正
- 全双工通信:两端节点同时交换数据
- 半双工:交替进行传输
链路层通过网卡进行通信
差错编码
不能保证100%可靠
循环冗余校验码:CRC
- 检错能力强大
- 将数据比特看成二进制,表示为D
- 选择一个r+1位比特的模式,表示G
- 目标选择r位的CRC比特,记为R,满足
- <D,R>编码结果可以被G整除
- 检错的话如果余数为0则没有错
那么如何得到R呢?通过下图可以得知利用唯一的G可以得到R
最终得到的数据报时101110 011
对于大数据的话,R的长度和G有关,因此位数少容易编码
局域网
MAC地址由IEEE统一管理,网卡生产厂商需要向IEEE买前24比特,后24比特自己分配
MAC地址对于某一个网卡是唯一的,属于数据链路层
ARP协议
同一个LAN里面如何根据IP确定MAC?
每一个主机会有ARP表,存储IP和MAC的映射表和存活时间
流程如下(同一局域网)