一、计算机网络概述

简述OSI七层网络模型并列举协议

计算机网络部分 - 图1
计算机网络体系结构.png
图 计算机网络体系结构


传输单位 主要任务 主要功能 典型协议或内容
应用层
与用户交互,传输用户数据 HTTP/HTTPS(超文本传输协议)
SMTP(电子邮件协议)
FTP(文件传输协议)
DNS(域名解析协议)
表示层 处理交换信息在两个通信系统中交换信息的表达方式 转换数据和信息白表示方式、数据压缩、加密和解密
会话层 负责管理(建立、管理、终止)主机间的进程会话。 利用传输层建立连接并有序的传输数据,建立会话,也称建立同步(SYN)
传输层 报文段(TCP)/用户数据报(UDP) 负责主机中的两个进程间的通信 为端到端提供可靠的传输服务、流量控制、差错控制、服务质量、数据管理 TCP/UDP
网络层 分组/IP数据报 把网络层协议的数据单元(分组)从源端传到目的端 关键问题是对分组进行路由选择,并实现流量控制、拥塞控制、差错控制、网际互联 IP、IPX
ICMP、IGMP、ARP、RARP、OSPF
数据链路层 数据帧 将网络层传来的IP数据报组装成帧 组装成帧、差错控制、流量控制、传输管理 SDLC、HDLC
PPP、STP和帧中继
物理层 比特(bit) 透明的传输比特流 在物理媒介上为数据端透明地传输原始比特流 通信链路与通信节点的接口参数
通信链路上传输的信号的意义和电气特征

双绞线、光缆、无线信道等不再物理协议之内,而在物理协议下面,有时被称为第0层

TCP/IP四层网络模型

TCP-IP四层模型.png
图 TCP/IP四层沙漏型网络模型

TCP/IP模型与OSI模型的比较

相同点:

  • 都采用分层体系,将庞大且复杂的问题划分为若干较容易处理的范围较小的问题;
  • 都基于独立的协议栈概念;
  • 都可以解决异构网络的互联,实现不同主机的通信。

不同点:

  • OSI最大的贡献是精确定义了服务协议接口这三个概念,与现代的面向对象程序设计思想非常吻合。而TCP/IP在这三个概念上没有明确区分;
  • 由于OSI参考模型在协议发明之前,所以没有偏向任何特定的协议,通用性好。
  • OSI参考模型当初之考虑用一种标准的公用数据网将各个系统互联,没有像TCP/IP一样考虑多种异构网的互联;
  • OSI参考模型在网络层支持无连接和面向连接的通信,但传输层仅有面连接的通信。而TCP/IP模型认为可靠性是端到端的问题,因此在网际层仅有一种无连接的通信模式,但是传输层支持无连接和面向连接两种模式。

总结:
OSI参考模型试图建立一个统一标准,最求完美,导致基于这一模型的软件效率极低。结构复杂、实现周期长、运行效率低,缺乏市场和商业动力,这是其未达到与其目标的重要原因。TCP/IP 四层是 OSI 七层的简化版,已经成为实事国际标准。

网络模型各层数据封装

各层数据封装.png

采用分层模型的优势和劣势

优势 劣势

- 各层之间相互独立
- 灵活性好
- 结构上可分割开
- 易于实现和维护
- 便于促进标准化

- 降低了效率
- 有些功能在不同层之间重复出现因而产生了额外开销

各层常见的中间设备(中继系统)

物理层:中继器,集线器(Hub)
数据链路层:网桥或网关
网络层:路由器
网络层以上:网关
注意:路由器有时也被称为网关,网关的英语原意是“连接两个区域的出入口”。路由器则是用于连接不同网络的设备。

在浏览器中输入一个网址会用到网络的那几层?以及各个层上的协议?

总体流程
域名解析 -> 建立 TCP 连接(三次握手)-> 发起 http 请求 -> 服务器响应 http 请求,浏览器得到 html 代码 -> 浏览器解析 html 代码,并请求 html 代码中的资源(如 js、css、图片等)-> 浏览器对页面进行渲染呈献给用户。

  • 浏览器要将URL解析为IP地址解析域名就要用到DNS协议,首先主机会查询DNS的缓存,如果没有就给本地DNS发送查询请求。

DNS查询分为两种方式,一种是递归查询,一种是迭代查询。如果是迭代查询,本地的DNS服务器,向根域 名服务器发送查询请求,根域名服务器告知该域名的一级域名服务器,然后本地服务器给该一级域名服务器发送查询请求,然后依次类推直到查询到该域名的IP地址。DNS服务器是基于UDP的,因此会用到UDP协议。

  • 得到IP地址后,浏览器就要与服务器建立一个http连接,因此要用到http协议。

http生成一个get请求报文,将该报文传给TCP层处理,所以还会用到TCP协议。如果采用https还会使用https协议先对http数据进行加密。TCP层如果有需要先将HTTP数据包分片,分片依据路径MTU和MSS。

  • TCP的数据包然后会发送给IP层,用到IP协议。IP层通过路由选路,一跳一跳发送到目的地址。

当然在一个网段内的寻址是通过以太网协议实现(也可以是其他物理层协议,比如PPP,SLIP),以太网协议需要直到目的IP地址的物理地址,有需要ARP协议。

其中:

  • DNS协议,http协议,https协议属于应用层

应用层是体系结构中的最高层。应用层确定进程之间通信的性质以满足用户的需要,应用层直接为用户的应用进程提供服务。

  • TCP/UDP属于传输层

传输层的任务就是负责主机中两个进程之间的通信。因特网的传输层可使用两种不同协议:即面向连接的传输控制协议TCP,和无连接的用户数据报协议UDP。面向连接的服务能够提供可靠的交付,但无连接服务则不保证提供可靠的交付,它只是“尽最大努力交付”。这两种服务方式都很有用,备有其优缺点。在分组交换网内的各个交换结点机都没有传输层。

  • IP协议,ARP协议属于网络层

网络层负责为分组交换网上的不同主机提供通信。在发送数据时,网络层将运输层产生的报文段或用户数据报封装成分组或包进行传送。在TCP/IP体系中,分组也叫作IP数据报,或简称为数据报。网络层的另一个任务就是要选择合适的路由,使源主机运输层所传下来的分组能够交付到目的主机。

  • 数据链路层

  • 物理层

二、应用层

网络应用模型


特点 优势
客户/服务器模型
(C/S模型)

- 客户是服务的请求方;服务器是服务的提供方
- 服务器启动后需要一直运行,被动的等待客户的连接和服务请求
- 客户端必须知道服务器的地址,服务器不需要知道客户端的地址
- 客户机之间不直接通信

- 管理集中和方便
P2P模型
- 本质上还是客户端服务端模型,只是每个节点既可以做做客户端访问其他系节点的资源,也可以做为服务端为其他节点提供资源

- 减轻了服务器的负担,消除了对某个服务器的完全依赖
- 客户端可以直接通信
- 可扩展性好、网络健壮性强

常见应用层协议

DNS
FTP
SMTP
POP3
HTTP
HDCP

HTTP1.1和 HTTP2.0有什么区别

HTTP1.1以下

  • 单工

HTTP1.1

  • 持久连接
  • 请求管道化
  • 增加缓存处理(新的字段如 cache-control)
  • 增加 Host 字段、支持断点传输等
  • http1.1半双工

HTTP2.0

  • 二进制分帧
  • 多路复用(或连接共享)
  • 头部压缩
  • 服务器推送
  • http2.0全双工

HTTP与HTTPS的区别和各自特点

区别:

  • HTTP协议是以明文的方式在网络中传输数据,而HTTPS协议传输的数据则是经过TLS加密后的,HTTPS具有更高的安全性
  • HTTPS在TCP三次握手阶段之后,还需要进行SSL 的handshake,协商加密使用的对称加密密钥
  • HTTPS协议需要服务端申请证书,浏览器端安装对应的根证书
  • HTTP协议端口是80,HTTPS协议端口是443

HTTPS优点:

  • HTTPS传输数据过程中使用密钥进行加密,所以安全性更高
  • HTTPS协议可以认证用户和服务器,确保数据发送到正确的用户和服务器

HTTPS缺点:

  • HTTPS握手阶段延时较高:由于在进行HTTP会话之前还需要进行SSL握手,因此HTTPS协议握手阶段延时增加
  • HTTPS部署成本高:一方面HTTPS协议需要使用证书来验证自身的安全性,所以需要购买CA证书;另一方面由于采用HTTPS协议需要进行加解密的计算,占用CPU资源较多,需要的服务器配置或数目高

HTTP返回码

HTTP协议的响应报文由状态行、响应头部和响应包体组成,其响应状态码总体描述如下:
1xx:指示信息—表示请求已接收,继续处理。
2xx:成功—表示请求已被成功接收、理解、接受。
3xx:重定向—要完成请求必须进行更进一步的操作。
4xx:客户端错误—请求有语法错误或请求无法实现。
5xx:服务器端错误—服务器未能实现合法的请求。

常见返回码
200 OK:客户端请求成功。
403 Forbidden:服务器收到请求,但是拒绝提供服务。
404 Not Found:请求资源不存在,举个例子:输入了错误的URL。

HTTP 中常见的 header 字段

cookie,请求时传递给服务端的 cookie 信息
set-cookie,响应报文首部设置要传递给客户端的 cookie 信息
allow,支持什么 HTTP 方法
last-modified,资源的最后修改时间
expires, 设置资源缓存的失败日期
content-language,实体的资源语言
content-encoding,实体的编码格式
content-length,实体主体部分的大小单位是字节
content-range,返回的实体的哪些范围
content-type,哪些类型
accept-ranges,处理的范围请求
age,告诉客户端服务器在多久前创建了响应
vary,代理服务器的缓存信息
location,用于指定重定向后的
URI If-Match,值是资源的唯一标识
User-Agent,将创建请求的浏览器和用户代理名称等信息传递给服务器
Transfer-Encoding,传输报文的主体编码方式
connection,管理持久连接,keep-alive , close
Cache-Control,控制浏览器的强缓存

HTTP中的短链接与长连接区别,以及应用场景

在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。
当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如:JavaScript文件、图像文件、CSS 文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话。

而从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这行代码:
Connection : keep-alive

在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP 数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。

Keep-Alive 不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如: Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。

Session、Cookie 的区别

  • session 在服务器端,cookie 在客户端(浏览器)
  • session 默认被存储在服务器的一个文件里(不是内存)
  • session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id)
  • session 可以放在 文件、数据库、或内存中都可以。
  • 用户验证这种场合一般会用 session

有哪些 web 性能优化技术?

  • DNS 查询优化
  • 客户端缓存
  • 优化 TCP 连接
  • 避免重定向
  • 网络边缘的缓存
  • 条件缓存
  • 压缩和代码极简化
  • 图片优化

Get 与 POST 的区别

(1)GET 一般用来从服务器上获取资源,POST 一般用来创建资源;

(2)GET 是幂等的,即读取同一个资源,总是得到相同的数据,而 POST 不是幂等的。GET 不会改变服务器上的资源,而 POST 会对服务器资源进行改变;

(3)从请求参数形式上看,GET 请求的数据会附在URL 之后;而 POST 请求会把提交的数据则放置在是 HTTP 请求报文的请求体中。

(4)POST 的安全性要比 GET 的安全性高,因为 GET 请求提交的数据将明文出现在 URL 上,而 POST 请求参数则被包装到请求体中,相对更安全。

(5)GET 请求的长度受限于浏览器或服务器对 URL 长度的限制,允许发送的数据量比较小,而 POST 请求则是没有大小限制的

DNS 的寻址过程

(1)在浏览器中输入www.baidu.com域名,操作系统会先检查自己本地的 hosts 文件是否有这个网址映射关系,如果有就先调用这个 IP 地址映射,完成域名解析。

(2)如果 hosts 里没有这个域名的映射,则查找本地 DNS 解析器缓存,是否有这个网址映射关系,如果有直接返回,完成域名解析。

(3)如果 hosts 与本地 DNS 解析器缓存都没有相应的网址映射关系,首先会找 TCP/IP 参数中设置的首选 DNS 服务器,在此我们叫它本地 DNS 服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。

(4)如果要查询的域名,不由本地 DNS 服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个 IP 地址映射,完成域名解析,此解析不具有权威性。

(5)如果本地 DNS 服务器本地区域文件与缓存解析都失效,则根据本地 DNS 服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地 DNS 就把请求发至 13 台根 DNS ,根 DNS 服务器收到请求后会判断这个域名 (.com) 是谁来授权管理,并会返回一个负责该顶级域名服务器的一个 IP。本地 DNS 服务器收到 IP 信息后,将会联系负责 .com 域的这台服务器。这台负责 .com 域的服务器收到请求后,如果自己无法解析,它就会找一个管理. com 域的下一级 DNS 服务器地址 (baidu.com) 给本地 DNS 服务器。当本地 DNS 服务器收到这个地址后,就会找 baidu.com 域服务器,重复上面的动作,进行查询,直至找到 www.baidu.com 主机。

(6)如果用的是转发模式,此 DNS 服务器就会把请求转发至上一级 DNS 服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根 DNS 或把转请求转至上上级,以此循环。不管是本地 DNS 服务器用是是转发,还是根提示,最后都是把结果返回给本地 DNS 服务器,由此 DNS 服务器再返回给客户机。

DNS缓存的作用

为了提高DNS查询效率,并减轻服务器的负荷和减少因特网上的DNS查询报文数量,在域名服务器中广泛使用了高速缓存,用来存放最近查询过的域名以及从何处获得域名映射信息的记录。

由于名字到地址的绑定并不经常改变,为保持高速缓存中的内容正确,域名服务器应为每项内容设置计时器并处理超过合理时间的项(例如:每个项目两天)。当域名服务器已从缓存中删去某项信息后又被请求查询该项信息,就必须重新到授权管理该项的域名服务器绑定信息。当权限服务器回答一个查询请求时,在响应中都指明绑定有效存在的时间值。增加此时间值可减少网络开销,而减少此时间值可提高域名解析的正确性。

不仅在本地域名服务器中需要高速缓存,在主机中也需要。许多主机在启动时从本地服务器下载名字和地址的全部数据库,维护存放自己最近使用的域名的高速缓存,并且只在从缓存中找不到名字时才使用域名服务器。

维护本地域名服务器数据库的主机应当定期地检查域名服务器以获取新的映射信息,而且主机必须从缓存中删除无效的项。由于域名改动并不频繁,大多数网点不需花精力就能维护数据库的一致性。

常见端口号

端口 服务 描述
20/TCP FTP [Default Data] 文件传输协议 - 默认数据端口
21/TCP FTP [Control] 文件传输协议 - 控制端口
22/TCP SSH SSH(Secure Shell) - 远程登录协议,用于安全登录文件传输(SCP,SFTP)及端口重新定向
23/TCP Telnet Telnet终端仿真协议 - 未加密文本通信
25/TCP SMTP SMTP(简单邮件传输协议) - 用于邮件服务器间的电子邮件传递
110/TCP POP3 邮局协议,“邮局协议”,第3版 - 用于接收电子邮件
220/TCP IMAP3 因特网信息访问协议,交互邮件访问协议第3版
53/UDP DNS DNS(域名服务系统)
123/UDP NTP NTP(Network Time Protocol) - 用于时间同步
80/TCP Http 超文本传输协议(超文本传输协议)- 用于传输网页
443/TCP Https 超文本传输安全协议 - 超文本传输协议 over TLS/SSL(加密传输)
1194/UDP OpenVPN
1433/TCP,UDP SQL Server Microsoft SQL 数据库系统
1434/TCP,UDP SQL Server monitor Microsoft SQL 活动监视器
1521/TCP Oracle Oracle数据库 default listener, in future releases official port 2483
3306/TCP,UDP MySQL MySQL数据库系统
6379/TCP Redis Redis数据库系统

三、传输层

从通信与信息三处理的角度看,传输层向应用层提供通信服务,属于面向通信部分的最高层,同时也是用户功能中的最低层。

当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端到端的通信时,只有位于网络边缘部分的主机的协议栈才有运输层,而网络核心部分中的路由器在转发分组时都只用到下三层的功能

传输层的端口与寻址

(1)端口的作用
端口能够让应用层的各种应用进程将其数据通过端口交付给传输层,以及让传输层知道应当将其报文段中的数据向上通过端口交付给应用层相应的进程。端口是传输层服务的访问点(TSAP)。

数据链路层的SAP是MAC地址,网络层SAP是IP,传输层SAP是端口;

(2)端口号
应用进程的通过端口号进行标识,端口号长度16bit,能够表示65536(216)个不同的端口。端口号具有本地意义。不同主机上的端口号并无联系。

根据端口号范围,可以将端口号分为两类:

  • 服务器使用端口号:又分为两类。最重要的一类是熟知端口号,数值为0~1023,另一类是登记端口号1024~49151。
  • 客户端使用端口号:49152~65535,在客户端程序运行时动态选择,又称短暂端口号(临时端口号)。

(3)套接字
在网络中通过IP地址标识和区分一台主机,通过端口号标识和区分一台主机中的不同进程,端口号拼接到IP地址上即构成套接字Socket,在网络中采用发送方和接收方的套接字来识别端点。
套接字 Socket = (IP地址:端口号)

TCP的建立过程(三次握手)

TCP运输连接的三个阶段:连接建立、数据传送、连接释放

建立过程中要解决的三个问题

  • 要使每一方能够确知对方的存在;
  • 要以允许双方协商一些参数(如最大窗口值等);
  • 能够运输一些实体资源(缓存大小等)

TCP的连接过程
计算机网络部分 - 图5
第一步:客户机的TCP首先向服务器的TCP发送连接请求报文段。这个特殊报文段中的首部同步位SYN置1,同时选择一个出时序列号seq = x。TCP规定,SYN报文段不能携带数据,但是要消耗一个序号,此时客户端状态之为SYNSENT(同步发送)状态。

第二步:服务器的TCP收到连接请求报文段后,若同意建立连接,则向客户机发回确认报文段,并为该TCP连接分配缓存和变量。在确认报文段中,首部同步位SYN和响应位ACK都置1,确认号是ack = x+1,同时为自己选一个初始序列号seq = y。确认报文段也不能携带数据,此时服务器状态为SYNREVD(同步接收)状态。

第三步:当客户机收到确认报文段后,还要向服务器返回确认报文,并为该TCP分配缓存和变量。确认报文段的的首部ACK位置1,确认号ack = y+1,序列号seq = x+1。该报文段可以携带数据,如果携带数据需要消耗一个序列号,不携带则不消耗。此时客户端进入ESTABLISHED(连接建立)状态。

注意:“三次握手”是指在一次握手过程中交换三次报文

为什么不能两次或四次握手

采用三次而不是两次,主要是防止两次握手情况下已经失效的连接请求报文段突然又传送到服务器而产生错误。

考虑下面的异常情况,客户端向服务器发出TCP连接请求,第一个连接请求报文在网络中某个节点长时间滞留,客户机超时认为报文丢失,与是在重传一次连接请求,服务器收到后建立连接。数据传输完毕后双方断开连接。而此时,前一个滞留在网络中的连接请求到达服务器,而服务器认为客户机又发来请求此时若参用“三次握手”,则服务器向客户机返回确认报文,由于是一个失效的报文,因此客户端不予理财,建立失败。若才采用“两次握手”,这种情况下,服务器认为传输连接已经建立,并一直等待客户端传输数据,此时客户机并无连接请求,因此不予理睬,造成服务器的资源来浪费。(选自《计算机网络 第七版 谢希仁》)

个人理解:若采用“二次握手”无法解决“要使每一方能够确知对方的存在”这一问题。
通过第一次和第二次的报文交换,客户端确认了服务器具有正常收发数据的能力,服务器确认了客户端具备发送能力,但是服务器还不能确认客户端是否具备数据接受能力。所以客户端可以认为连接已经建立,但服务端还不能;
通过第三次报文交换,服务器可以确认客户端已经受到了反馈,即客户端具备数据接受能力,故服务端可以认为连接已建立;
后面就进入了全双工数据传输阶段。

简单来说就是“两次不能确保双方都已经具备收发能力,四次重复了一步,降低了效率“。

TCP连接的释放(四次挥手)

计算机网络部分 - 图6
释放过程
第一步:客户端打算释放TCP连接时,客户端应用程序先向其TCP发送连接释放报文段,并停止发送数据,主动关闭TCP连接。客户端发出释放报文段首部的终止位FIN置1,其序列号seq = u,等于上一个数据段的最后一个子字节的序号加1。FIN报文段即使不携带数据也消耗一个序号。此时TCP客户端进入FIN-WAIT-1状态。TCP是全双工的,此时发送FIN报文段的一端不能在发送数据,另一端还能发送。

第二步:服务器端收到连接释放报文段后,立刻发出响应报文段,该报文段ack = u+1,序列号seq = v,等于上一个数据段的最后一个子字节的序号加1。并通知进程关闭TCP连接,然后服务端处于CLOSE-WAIT状态。此时客户机到服务器这个方向的连接就释放了,TCP连接处于半关闭状态,即服务器发送的数据客户端还得继续接收。

第三步:若服务器没有数据继续向客户端发送,就通知客户端结束连接。该报文段首部的终止位FIN置1,确认号ack = u+1,序列号seq = w(在CLOSE-WAIT状态下服务器可能会向客户端发送了数据)。此时服务器进入LAST-ACK(最后确认)状态。

第四步:客户端收到连接释放报文段后,必须发出确认。把报文段首部ACK置1,确认号ack = w+1,seq =
+1,此时客户端还未释放,直到2个MSL(最长报文寿命)后客户端才会进入CLOSED(连接关闭)状态。

客户端A必须等待 2MSL 的时间

第一,为了保证 A 发送的最后一个 ACK 报文段能够到达 B。
第二,防止 “已失效的连接请求报文段”出现在本连接中。A 在发送完最后一个 ACK 报文段后,再经过时间 2MSL,就可以使本连接持续的时间内所产生的所有报文段,都从网络中消失。这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段。

TCP如何保证可靠性

  • 序号
  • 确认号
  • 校验和
  • 重传(超时重传、冗余ACK重传或快速重传)
  • 窗口控制(流量控制)
  • 拥塞控制

(1)序列号
TCP 传输时将每个字节的数据都进行了编号,这就是序列号。序列号的作用不仅仅是应答作用,有了序列号能够将接收到的数据根据序列号进行排序,并且去掉重复的数据。

(2)确认应答
TCP 传输过程中,每次接收方接收到数据后,都会对传输方进行确认应答,也就是发送 ACK 报文,这个 ACK 报文中带有对应的确认序列号,告诉发送方,接收了哪些数据,下一次数据从哪里传。

(3)校验和
在数据传输过程中,将发送的数据段都当做一个 16 位的整数,将这些整数加起来,并且前面的进位不能丢弃,补在最后,然后取反,得到校验和。
发送方:在发送数据之前计算校验和,并进行校验和的填充。接收方:收到数据后,对数据以同样的方式进行计算,求出校验和,与发送方进行比较。

(4)超时重传
在进行 TCP 传输时,由于存在确认应答与序列号机制,也就是说发送方发送一部分数据后,都会等待接收方发送的 ACK 报文,并解析 ACK 报文,判断数据是否传输成功。如果发送方发送完数据后,迟迟都没有接收到接收方传来的 ACK 报文,那么就对刚刚发送的数据进行重发。

(5)流量控制(窗口控制)
如果发送方的发送速度太快,会导致接收方的接收缓冲区填充满了,这时候继续传输数据,就会造成大量丢包,进而引起丢包重传等等一系列问题。TCP 支持根据接收端的处理能力来决定发送端的发送速度,这就是流量控制机制。
具体实现方式:接收端将自己的接收缓冲区大小放入 TCP 首部的『窗口大小』字段中,通过 ACK 通知发送端。

(6)拥塞控制
TCP 传输过程中一开始就发送大量数据,如果当时网络非常拥堵,可能会造成拥堵加剧。所以 TCP 引入了慢启动机制,在开始发送数据的时候,先发少量的数据探探路。

TCP 协议如何提高传输效率

一句话:TCP 协议提高效率的方式有滑动窗口、快重传、延迟应答、捎带应答等。

(1)滑动窗口
如果每一个发送的数据段,都要收到 ACK 应答之后再发送下一个数据段,这样的话我们效率很低,大部分时间都用在了等待 ACK 应答上了。

为了提高效率我们可以一次发送多条数据,这样就能使等待时间大大减少,从而提高性能。窗口大小指的是无需等待确认应答而可以继续发送数据的最大值。

(2)快重传
快重传也叫高速重发控制。

那么如果出现了丢包,需要进行重传。一般分为两种情况:

情况一:数据包已经抵达,ACK 被丢了。这种情况下,部分 ACK 丢了并不影响,因为可以通过后续的 ACK 进行确认;

情况二:数据包直接丢了。发送端会连续收到多个相同的 ACK 确认,发送端立即将对应丢失的数据重传。

(3)延迟应答
如果接收数据的主机立刻返回 ACK 应答,这时候返回的窗口大小可能比较小。

假设接收端缓冲区为 1M,一次收到了 512K 的数据;如果立刻应答,返回的窗口就是 512K;
但实际上可能处理端处理速度很快,10ms 之内就把 512K 的数据从缓存区消费掉了;
在这种情况下,接收端处理还远没有达到自己的极限,即使窗口再放大一些,也能处理过来;
如果接收端稍微等一会在应答,比如等待 200ms 再应答,那么这个时候返回的窗口大小就是 1M;

窗口越大,网络吞吐量就越大,传输效率就越高;我们的目标是在保证网络不拥塞的情况下尽量提高传输效率。

(4)捎带应答
在延迟应答的基础上,很多情况下,客户端服务器在应用层也是一发一收的。这时候常常采用捎带应答的方式来提高效率,而 ACK 响应常常伴随着数据报文共同传输。如:三次握手。

TCP的有限状态机(状态变迁)

  • TCP 的有限状态机可以更清晰地看出 TCP 连接的各种状态之间的关系。TCP 有限状态机的图中每一个方框都是 TCP 可能具有的状态;
  • 每个方框中的大写英文字符串是 TCP 标准所使用的 TCP 连接状态名;
  • 状态之间的箭头表示可能发生的状态变迁;
  • 箭头旁边的字,表明引起这种变迁的原因,或表明发生状态变迁后又出现什么动作;
  • 图中有三种不同的箭头:
    • 粗实线箭头表示对客户进程的正常变迁
    • 粗虚线箭头表示对服务器进程的正常变迁
    • 细线箭头表示异常变迁

TCP有限状态机2.png

TCP的流量控制(窗口控制)

以字节为单位的滑动窗口
接收窗口(receive widows,rwnd):获取对端的接收能力
TCP首部-窗口;
发送方的窗口不能超过接收方给的接收窗口的数值;

因为网络中设备数量较多,设备处理能力各不相同,为了让数据发送端适配接收端的接收处理能力,接收端在接收数据时向发送端发送流控消息。
流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。

流量控制是点对点通量的控制,是个端到端的问题(接收端控制发送端),流量控制要做的就是抑制发送端发送数据的速率。

传输层和数据链路层的流量控制区别

  • 传输层定义端到端用户之间的流量控制,而数据链路层定义中间的相邻节点的流量控制;
  • 数据链路层的滑动窗口协议的窗口大小不能动态变化,传输层的可以。

TCP的拥塞控制

网络资源:计算机中网络中的链路容量(带宽)、交换节点中的缓存和处理机等都是网络的资源。

拥塞:在某段时间,若是对网络中的某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏。

  • 特点:拥塞常常趋于恶化,拥塞引起的重传并不会缓解拥塞,反而加剧了拥塞。

接收窗口(receive widows,rwnd):获取对端的接收能力

拥塞窗口(crowded windows,cwnd):发送方根据自己估算的网络拥堵的程度而设置的窗口值,反映网络往前的容量。
发送窗口的的上限值 = min[ rwnd,cwnd]

若是假设接收方有足够大的缓存,则发送方的发送窗口等同于拥塞窗口。

拥塞控制算法

算法 思路 注意
慢开始算法 是指在TCP刚刚开始发送TCP报文段时,并不清楚网络状况,所以由小到大逐渐增大发送窗口,也就是逐渐增大拥塞窗口数值,进行试探 需要注意的是慢开始并不是指增长速率满,而是指TCP刚开始发送报文段时先设置cwnd = 1,使得发送方开始时只能发送一个报文段(试探网络状况),然后在逐渐增大
拥塞避免算法 让拥塞窗口缓慢增加,具体做法是把发送方的拥塞窗口cwnd加一而不是翻倍
- 当 cwnd < ssthresh时,使用慢开始算法
- 当 cwnd > ssthresh时,停止使用慢开始算法而改用拥塞避免算法
- 当 cwnd = ssthresh时,既可使用慢开始算法,也可使用拥塞避免算法
快重传算法 当发送方连续收到三个重复的ACK报文段时,直接重传对方尚未收到的报文段,而不必等待那个报文段设置的重传计时器 快速重传使用冗余的ACK来检测对报道俄发生
快恢复算法 当发送方连续收到三个重复的ACK报文段时,执行“乘法减小”算法,慢开始门限ssthresh设置为此时发送方cwnd的一半,然后执行拥塞避免 发送方认为现在网络可能并没有严重拥塞,否则就不会收到3个连续的ACK,所以不执行慢开始,所以被成为快恢复

四种算法使用总结

  • 在TCP建立和网络超时时,采用满开始和拥塞避免算法
  • 当发送发接收到冗余ACK时,采用快重传和快恢复算法

image.png
图 四种算法实现过程
TCP拥塞控制流程图.png

拥塞控制与流量控制

拥塞控制是防止过多数据注入网络,防止网络中的路由器或链路过载;
拥塞控制是让网络能够承受现有的网络负荷,是一个全局性的过程;

流量控制往往指点对点通信量的控制,是个端到端的问题(接收端控制发送端);
流量控制所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收。

拥塞控制和流量控制之所以常常被弄混,是因为某些拥塞控制算法是向发送端发送控制报文,并告诉发送端,网络已出现麻烦,必须放慢发送速率(都是改变拥塞窗口实现)。这点又和流量控制是很相似的。

Server监听端口,等待客户端连接时进程处于什么状态

如果Accept设置了阻塞,则进程是阻塞等待;
如果线程使用poll、select、epoll等IO复用,可以处于运行状态。

TCP与UDP网络编程(socket)

基于TCP的socket
image.png
图 TCP网络编程基本步骤

  • 服务器端程序
    1. socket():创建一个socket
    2. bind():绑定IP地址、端口等信息到socket上
    3. listen():设置允许的最大连接数
    4. accept():接收客户端上来的连接
    5. 收发数据,用函数send()和recv(),或者read()和write()
    6. close():关闭网络连接
  • 客户端程序:
    1. socket():创建一个socket
    2. 设置要连接的对方的IP地址和端口等属性
    3. connect():连接服务器,用函数connect()
    4. 收发数据,用函数send()和recv(),或read()和write()
    5. close():关闭网络连接

基于UDP的socket

  • 服务器端流程
    1. socket():建立套接字文件描述符
    2. bind():绑定侦听端口,将套接字文件描述符和一个地址类型变量进行绑定
    3. recvfrom():接收客户端的数据
    4. sendto():向客户端发送数据
    5. close():关闭套接字,释放资源
  • 客户端流程
    1. socket():建立套接字文件描述符
    2. recvfrom():接收客户端的数据
    3. sendto():向客户端发送数据
    4. close():关闭套接字,释放资源

计算机网络部分 - 图11
图 UDP网络编程基本步骤

UDP中使用connect( )

尽管数据报socket是无连接的,但是在数据报socket上应用connect( )系统调用仍然起作用。

在数据报socket上调用connect( )会导致内核记录这个socket的对等socket的地址。

当一个数据报socket( )建立连接后:

  • 数据报的发送可以在socket上直接使用send( )(或write)完向对端socket发送数据报;
  • 在这个socket上只能读取由对端socket发送的数据报。

注意:connect( ) 的作用对数据报socket不是对称的。以上论述,只针对调用了connect( )的数据报socket。

阻塞和非阻塞、同步与异步

TCP的心跳包(Keep-Alive)

除时间等待计时器外,TCP还有一个保活计时器(keep-alive timer)。
设想这样的场景∶客户已主动与服务器建立了TCP 连接。但后来客户端的主机突然发生故障。显然,服务器以后就不能再收到客户端发来的数据。因此,应当有措施使服务器不要再白白等待下去。这就需要使用保活计时器了。

服务器每收到一次客户的数据,就重新设置保活计时器,时间的设置通常是两个小时。若两个小时都没有收到客户端的数据,服务端就发送一个探测报文段,以后则每隔75秒钟发送一次。若连续发送10个探测报文段后仍然无客户端的响应,服务端就认为客户端出了故障,接着就关闭这个连接。

TCP的粘包与拆包

现象
在进行网络编程时,可能会发现:如果客户端连续不断的向服务端发送数据包时,服务端接收的数据会出现两个数据包粘在一起的情况。

接收端收到了两个数据包,但是这两个数据包要么是不完整的,要么就是多出来一块,这种情况即发生了拆包和粘包。拆包和粘包的问题导致接收端在处理的时候会非常困难,因为无法区分一个完整的数据包。

粘包产生原因
首先,TCP是基于字节流的,虽然应用层和TCP传输层之间的数据交互是大小不等的数据块,但是TCP把这些数据块仅仅看成一连串无结构的字节流,没有边界;其次,从TCP的帧结构也可以看出,在TCP的首部没有表示数据长度的字段。

基于上面两点,在使用TCP传输数据时,才有粘包或者拆包现象发生的可能。一个数据包中包含了发送端发送的两个数据包的信息,这种现象即为粘包。

  • 发送方产生粘包

采用TCP协议传输数据的客户端与服务器经常是保持一个长连接的状态(一次连接发一次数据不存在粘包),双方在连接不断开的情况下,可以一直传输数据。
当发送的数据包过于的小时,那么TCP协议默认的会启用Nagle算法,将这些较小的数据包进行合并发送(缓冲区数据发送是一个堆压的过程);这个合并过程就是在发送缓冲区中进行的,也就是说数据发送出来它已经是粘包的状态了。

  • 接收方产生粘包

接收方采用TCP协议接收数据时的过程是这样的:数据到接收方,从网络模型的下方传递至传输层,传输层的TCP协议处理是将其放置接收缓冲区,然后由应用层来主动获取(C语言用recv、read等函数);
这时会出现一个问题,就是我们在程序中调用的读取数据函数不能及时的把缓冲区中的数据拿出来,而下一个数据又到来并有一部分放入的缓冲区末尾,等我们读取数据时就是一个粘包。(用户放数据的速度>应用层拿数据速度)

粘包与拆包的解决办法
分包机制一般有两个通用的解决方法:

  • 特殊字符控制(项目现在使用的)
  • 在包头首都添加数据包的长度(新设计的协议帧)

注意:UDP没有粘包问题,但是有丢包和乱序。不完整的包是不会有的,收到的都是完全正确的包。传送的数据单位协议是UDP报文或用户数据报,发送的时候既不合并,也不拆分。

最大并发TCP连接数

client最大tcp连接数
client每次发起tcp连接请求时,除非绑定端口,通常会让系统选取一个空闲的本地端口(local port),该端口是独占的,不能和其他tcp连接共享,因此client端的tcp连接数取决于/受限于端口数量。tcp端口的数据类型是unsigned short,因此本地端口个数最大只有65536,端口0有特殊含义,不能使用,这样可用端口最多只有65535,所以在全部作为client端的情况下,一个client最大tcp连接数为65535,这些连接可以连到不同的server ip。

server最大tcp连接数
server通常固定在某个本地端口上监听,等待client的连接请求。不考虑地址重用(unix的SO_REUSEADDR选项)的情况下,即使server端有多个ip,本地监听端口也是独占的,因此server端tcp连接4元组中只有remote ip(也就是client ip)和remote port(客户端port)是可变的,因此最大tcp连接为客户端ip数×客户端port数,对IPV4,不考虑ip地址分类等因素,最大tcp连接数约为2的32次方(ip数)×2的16次方(port数),也就是server端单机最大tcp连接数约为2的48次方。

实际的tcp连接数
上面给出的是理论上的单机最大连接数,在实际环境中,受到机器资源、操作系统等的限制,特别是sever端,其最大并发tcp连接数远不能达到理论上限。在unix/linux下限制连接数的主要因素是内存和允许的文件描述符个数(每个tcp连接都要占用一定内存,每个socket就是一个文件描述符),另外1024以下的端口通常为保留端口。

对server端,通过增加内存、修改最大文件描述符个数等参数,单机最大并发TCP连接数超过10万,甚至上百万是没问题的。

利用UDP实现可靠传输

UDP属于无连接协议,具有资源消耗少,处理速度快的优点,所以通常音频,视频和普通数据在传送时,使用UDP较多,因为即使丢失少量的包,也不会对接受结果产生较大的影响。

传输层无法保证数据的可靠传输,只能通过应用层来实现了。实现的方式可以参照tcp可靠性传输的方式,只是实现不在传输层,实现转移到了应用层。

最简单的方式是在应用层模仿传输层TCP的可靠性传输。下面不考虑拥塞处理,可靠UDP的简单设计。

  • 添加seq/ack机制,确保数据发送到对端
  • 添加发送和接收缓冲区,主要是用户超时重传。·
  • 添加超时重传机制。

详细说明:送端发送数据时,生成一个随机seq=x,然后每一片按照数据大小分配seq。数据到达接收端后接收端放入缓存,并发送一个ack=x的包,表示对方已经收到了数据。发送端收到了ack包后,删除缓冲区对应的数据。时间到后,定时任务检查是否需要重传数据。

已有开源协议

  • RUDP (Reliable User Datagram Protocol)
  • RTP (Real Time Protocol)
  • UDT (UDP-based Data Transfer Protocol)

TCP与UDP比较

计算机网络部分 - 图12

说明 特点 用途
User Datagrame Protocol
用户数据报协议UDP
在IP的数据服务上增加了两个基本的服务:复用和分用、差错检测。UDP比较简单,因此执行速度快、时实性好
- UDP无需建立连接
- 尽最大努力交付
- 没有拥塞控制
- 面向报文
- 首部开销小
- 支持一对一、一对多、多对一、多对多

- 常用于一次性传输较少数据的网络应用,DNS、SNMP
- 多媒体应用,实时电话会议、流媒体等
Transmission Control Protocol
传输控制协议TCP
提供面向连接的可靠传输服务,在传输数据之前必须建立连接。不可避免的增加了系统开销
- 面向连接的传输协议
- 每条TCP连接只能是点对点
- 提供可靠服务
- 提供全双工通信
- 面向字节流

- 适用于可靠性更重要的场合如文件传输协议(FTP)、超文本传输协议(HTTP)、SSH等

总结

  • TCP 向上层提供面向连接的可靠服务 ,UDP 向上层提供无连接不可靠服务。
  • UDP 没有 TCP 传输可靠,但是可以在实时性要求高的地方有所作为。
  • 对数据准确性要求高,速度可以相对较慢的,可以选用 TCP。

四、网络层

网络层作用

向上提供简单灵活的、无连接的、进最努力交付的数据报服务。

IP地址的作用

IP地址是IP协议提供的一种统一的地址格式,为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。

IP数据报格式与作用

IP数据报格式.png
图 IP数据报格式

字段名称 字段长度 字段含义
版本 占 4 位 指 IP 协议的版本。目前的 IP 协议版本号为 4 (即 IPv4)
首部长度 占 4 位 可表示的最大数值是 15 个单位(一个单位为 4 字节),因此 IP 的首部长度的最大值是 60 字节
总长度 占 16 位 指首部和数据之和的长度,单位为字节,因此数据报的最大长度为 65535 字节。总长度必须不超过最大传送单元 MTU
标识 占 16 位 它是一个计数器,用来产生 IP 数据报的标识
标志 占 3 位 目前只有前两位有意义。
标志字段的最低位是 MF (More Fragment)。MF = 1 表示后面“还有分片”。MF = 0 表示最后一个分片。
标志字段中间的一位是 DF (Don’t Fragment) 。只有当 DF = 0 时才允许分片。
片偏移 占 13 位 较长的分组在分片后某片在原分组中的相对位置。片偏移以 8 个字节为偏移单位
生存时间 占 8 位 记为 TTL (Time To Live),指示数据报在网络中可通过的路由器数的最大值
协议 占 8 位 指出此数据报携带的数据使用何种协议,以便目的主机的 IP 层将数据部分
上交给那个处理过程
首部校验和 占 16 位 只检验数据报的首部,不检验数据部分。这里不采用 CRC 检验码而采用简单的计算方法
源地址字段 占 4 字节 发送方IP地址
目的地址字段 占 4 字节 接收方IP地址

IPv4数据报分组

  • 分片过程

假设原IP分组总长为L字节、待转发链路的MTU为M

  1. 若L > M,且DF = 0,则可以进行分片;
  2. 分片时每个片首部的标识复制原IP的首部的标识;
  3. 通常分片时,除最后一片,其他分片的长度均为MTU允许的最大长度,由于片偏移是8的倍数,故一个片中封装的数据长度应该是8的倍数。
  4. 故一个分片最大封装数据长度
    计算机网络部分 - 图14%22%20aria-hidden%3D%22true%22%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMATHI-64%22%20x%3D%220%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMAIN-3D%22%20x%3D%22801%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMAIN-230A%22%20x%3D%221857%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%3Cg%20transform%3D%22translate(2302%2C0)%22%3E%0A%3Cg%20transform%3D%22translate(120%2C0)%22%3E%0A%3Crect%20stroke%3D%22none%22%20width%3D%223395%22%20height%3D%2260%22%20x%3D%220%22%20y%3D%22220%22%3E%3C%2Frect%3E%0A%3Cg%20transform%3D%22translate(60%2C676)%22%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMATHI-4D%22%20x%3D%220%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMAIN-2212%22%20x%3D%221273%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%3Cg%20transform%3D%22translate(2274%2C0)%22%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMAIN-32%22%3E%3C%2Fuse%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMAIN-30%22%20x%3D%22500%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMAIN-38%22%20x%3D%221447%22%20y%3D%22-687%22%3E%3C%2Fuse%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMAIN-230B%22%20x%3D%225937%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMAIN-2217%22%20x%3D%226604%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMAIN-38%22%20x%3D%227326%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%3C%2Fg%3E%0A%3C%2Fsvg%3E#card=math&code=d%20%3D%20%5Clfloor%20%5Cfrac%7BM-20%7D%7B8%7D%20%5Crfloor%20%2A8&id=N6nwZ)
  5. 分片个数
    计算机网络部分 - 图15
  6. 每个片的片偏移字段取值
    计算机网络部分 - 图16 //片偏移以8个字节为单位
  7. 每片的总长度
    计算机网络部分 - 图17 //L中包含了首部长度
  8. MF 的取值
    计算机网络部分 - 图18
  • 分片实例

一个IP数据报总长度为3820字节,其首部长度为20字节,网络允许的MTU = 1425字节,给出每个分片的参数。
答:

  • 分片的数据长度

计算机网络部分 - 图19

  • 分组个数

计算机网络部分 - 图20

  • 每个片的片偏移字段取值

计算机网络部分 - 图21
第一个分片的片偏移为0;第二个分片的片偏移为175;第三个分片的片偏移为350。

网络层如何区分UDP与TCP报文

IP数据报的首部有一个标示协议的字段(占1字节),以便目的主机的IP层知道应该将数据上交给哪个协议去处理,常用的协议以及相应的协议字段如下

协议名 ICMP IGMP IP TCP EGP IGP UDP IPv6
自协议字段值 1 2 4 6 8 9 17 41

分类的IP地址

IP地址都是由网络号主机号两部分组成, 即 IP地址 ::= {<网络号>,<主机号>}
分类的IP地址.png
特殊用途的地址(不用作主机的IP地址)

  • 主机号全为0表示网络本身。如192.168.1.0
  • 主机号全为1表示本网络的广播地址,又称直接广播地址:192.168.1.255

  • 127.x.x.x保留为回环自检地址,表示任意主机本身,永远不会出现任何网络上

  • 32位全为0,即0.0.0.0,表示本网络上的本主机

  • 32位全为1,即255.255.255.255,表示整个TCP/IP网络的广播地址,又称受限广播地址。
    • 实际使用中因为路由器对广播域的隔离,255.255.255.255等效为本网络的广播地址。

常用的三类IP地址使用范围

网络类别 最大可用网络数 第一个可用的网络号 最后一个可用网络 每个网络最大主机数
A 27- 2 1 126 224- 2
B 214- 2 128.1 191.255 216- 2
C 221- 2 192.0.1 223.255.255 28- 2

在IP地址3种主要类型里,各保留了3个区域作为私有地址,A、B、C类地址的默认子网掩码分别是255.0.0.0、255.255.0.0、255.255.255.0。其地址范围如下:

类型 范围
A类网段(1个) 10.0.0.0 ~ 10.255.255.255
B类网段(16个) 172.16.0.0 ~ 172.31.255.255
C类网段(256个) 192.168.0.0 ~ 192.168.255.255

IP地址的特点

  • 每个IP地址都是由网络号主机号两部分构成,因此IP地址是一种分等级的地址结构
  • IP地址是标志一台主机(或路由器)和一条链路的接口
  • 用转发器或桥接器等链接若干LAN仍然是同一个网络(同一个广播域),因此该LAN中所有主机的网络号必须相同,主机号必须不同
  • 在IP地址中,所有分配到网络号的网络(不管是LAN还是WAN)都是平等的
  • 在同一个局域网中的主机或路由器的IP地址中的网络号必须是相同的。路由器总是有两个或以上的IP地址,且两个IP地址网络号不同


IPv4地址不够的解决

目前主要有以下两种方式:

  • 其实我们平时上网,电脑的IP地址都是属于私有地址,我无法出网关,我们的数据都是通过网关来中转的,这个其实NAT协议,可以用来暂缓IPV4地址不够。

  • IPv6:作为接替IPv4的下一代互联网协议,其可以实现2的128次方个地址,该协议能够从根本上解决IPv4地址不够用的问题。

子网划分、子网掩码

子网划分解决的问题

  • 两级IP地址的地址空间利用率低
  • 给每个物理网络分配一个网络号会使路由表过大,使网络性能变坏
  • 两级IP地址不够灵活

子网划分思想

  • 子网划分存属一个单位内部事,单位对外仍表现为没有划分子网的网络
  • 从主机号借用若干bit作为子网号,相应的主机号会减少相同bit;三级IP地址结构如下

IP地址 = {<网络号>,<子网号>,<主机号>}

  • 子网划分只是把IP地址的主机号这部分进行再划分,而不改变IP地址原来的网络号

子网掩码
为了告诉路由器或主机对一个A类、B类、C类网络进行了划分,使用子网掩码来表达对原网络中主机号的借位

  • 子网掩码与IP地址长度相对应,长32bit的二进制串,它由一串1和跟随一串0组成
  • 将IP地址与其对应的子网掩码逐位“与”(逻辑AND运算),就可以得到相应子网的网络地址
  • 现在英特网标准规定必须使用子网掩码,若是一个子网未进行子网划分,那么将采用默认子网掩码,A、B、C类地址的默认子网掩码分别是255.0.0.0、255.255.0.0、255.255.255.0

无分类编址 (CIDR)

CIDR的主要特点

  • CIDR 消除了传统的 A 类、B 类和 C 类地址以及划分子网的概念,因而可以更加有效地分配 IPv4 的地址空间。
  • CIDR使用各种长度的“网络前缀”(network-prefix)来代替分类地址中的网络号和子网号。
  • IP 地址从三级编址(使用子网掩码)又回到了两级编址。

CIDR无分类的两级编址

  • 无分类的两级编址的记法是

CIDR主机号.png
IP地址 ::= {<网络前缀>, <主机号>}

  • CIDR 使用“斜线记法”(slash notation),它又称为 CIDR 记法,即在 IP 地址面加上一个斜线“/”,然后写上网络前缀所占的位数(这个数值对应于三级编址中子网掩码中 1 的个数)。例如: 220.78.168.0/24

CIDR 地址块

  • CIDR 把网络前缀都相同的连续的 IP 地址组成“CIDR 地址块”
  • 128.14.32.0/20 表示的地址块共有 212 个地址(因为斜线后面的 20 是网络前缀的位数,所以这个地址的主机号是 12 位)
    • 这个地址块的起始地址是 128.14.32.0
    • 在不需要指出地址块的起始地址时,也可将这样的地址块简称为“/20 地址块”
    • 128.14.32.0/20 地址块的最小地址:128.14.32.0
    • 128.14.32.0/20 地址块的最大地址:128.14.47.255
    • 全 0 和全 1 的主机号地址一般不使用

CIDR最长前缀匹配原则

  • 使用 CIDR 时,路由表中的每个项目由“网络前缀”和“下一跳地址”组成。在查找路由表时可能会得到不止一个匹配结果。
  • 应当从匹配结果中选择具有最长网络前缀的路由:最长前缀匹配 (longest-prefix matching)。
  • 网络前缀越长,其地址块就越小,因而路由就越具体 (more specific) 。
  • 最长前缀匹配又称为最长匹配或最佳匹配。

例如:

  1. 收到的分组的目的地址 D = 206.0.71.130
  2. 路由表中的项目:206.0.68.0/22 1
  3. 206.0.71.128/25 2
  4. 查找路由表中的第 1 个项目:
  5. 1 个项目 206.0.68.0/22 的掩码 M 22 个连续的 1
  6. M = 11111111 11111111 11111100 00000000
  7. 因此只需把 D 的第 3 个字节转换成二进制。
  8. M = 11111111 11111111 111111|00 00000000
  9. AND D = 206. 0. 010001|11. 130
  10. --------------------------------------------------------
  11. 206. 0. 010001|00. 0
  12. 206.0.68.0/22 匹配!
  13. 查找路由表中的第 2 个项目:
  14. 2 个项目 206.0.71.128/25 的掩码 M 25 个连续的 1
  15. M = 11111111 11111111 11111111 10000000
  16. M = 11111111 11111111 11111111 1|0000000
  17. AND D = 206. 0. 71. 1|0000010
  18. --------------------------------------------------------
  19. 206. 0. 71. 1|0000000
  20. 206.0.71.128/25 也匹配!
  21. 选择两个匹配的地址中更具体的一个,即选择最长前缀的地址。选择第二个

地址解析协议(ARP)(网络层)

Address Resolution Protocol
用于解决同一个局域网上的主机或路由器的IP地址和硬件地址的映射问题。
ARP请求分组时广播发送的(因为不知道目的主机的MAC地址),但是ARP响应分组时普通的单播,即从一个源地址发送到一个目的地址。

网际控制报文协议(ICMP)(网络层)

Internet Control Message Protocol
为了提高IP数据报交付成功的机会,在网络上使用此协议来让主机或路由器报告差错和异常情况。
ICMP的两类报文:差错报告报文和询问报文


报文类型 作用
差错报文 终点不可达 当路由器或主机不嫩给交付报文时,就向源点发送终点不可达报文
源点抑制 当路由器或主机由于拥塞而丢弃数据报时,向源点发送源点抑制报文,使源点知道应该降低数据报发送速率
时间超时 当路由器收到生存时间(TTL)为0的数据报时,丢弃该报文的同时,向源点发送时间超时报文
参数问题 当路由器的湖泊目的主机收到的数据报的首部中有的字段的值不正确时就丢弃该报文,并向源点发送参数问题报文
改变路由(重定向) 路由器把改变路由报文发送给主机,让主机知道下次应该将数据报发送给另一个路由器
询问报文 回送请求和回答报文
时间戳请求和回答报文
地址掩码请求和回答报文
路由询问和通告报文

不发送差错报文的情况:

  • 对ICMP差错报告报文不再发送ICMP差错报告报文
  • 对第一个分片的数据报的所有后续数据报都不发送ICMP差错报告报文
  • 对具有组播地址的数据报都不发送ICMP差错报文
  • 对具有特殊地址(如127.0.0.0、0.0.0.0)的数据报不发送ICMP差错报告报文

注意:

  • ping工具工作在应用层,但是他直接使用的是网络层的ICMP协议回送请求和回答报文,而未使用传输层的TCP或UDP协议
  • Tracerouter工作在网络层,使用的是ICMP的时间超过报文

ICMP主要有两个应用

一个是 Ping,一个是Traceroute。

  1. Ping

Ping是ICMP的一个重要应用,主要用来测试两台主机之间的连通性。
Ping 的原理是通过向目的主机发送ICMP Echo请求报文,目的主机收到之后会发送Echo回答报文。
Ping 会根据时间和成功响应的次数估算出数据包往返时间以及丢包率。

  1. Traceroute

Traceroute 是 ICMP的另一个应用,用来跟踪一个分组从源点到终点的路径。
Traceroute 发送的IP数据报封装的是无法交付的UDP 用户数据报,并由目的主机发送终点不可达差错报告报文。

  • 源主机向目的主机发送一连串的IP数据报。第一个数据报P1的生存时间TTL设置为1,当P1到达路径上的第一个路由器R1时,R1收下它并把TTL减1,此时TTL等于0,R1就把P1丢弃,并向源主机发送一个ICMP时间超过差错报告报文;
  • 源主机接着发送第二个数据报P2,并把TTL设置为2。P2先到达R1,R1收下后把TTL减1再转发给R2,R2收下后也把TTL减1,由于此时TTL等于0,R2就丢弃P2,并向源主机发送一个ICMP时间超过差错报文。

不断执行这样的步骤,直到最后一个数据报刚刚到达目的主机,主机不转发数据报,也不把TTL值减1。但是因为数据报封装的是无法交付的UDP,因此目的主机要向源主机发送ICMP终点不可达差错报告报文。之后源主机知道了到达目的主机所经过的路由器IP地址以及到达每个路由器的往返时间。

网络地址转换(NAT)(传输层)

Net Adress Trans
通过将专用网络地址(如Intranet)转换为公用地址(如Internet),从而对外隐藏内部管理的IP地址。
由于专用网本地IP地址是可重用的,所以NAT大大节省了IP地址的消耗。

私有地址只能用于LAN,不能用于WAN链接,因此私有地址不能直接用于Internet,必须通过网关利用NAT把私有地址转换为Internet中合法的全球IP地址。

NAT包括:静态NAT、动态NAT、ALG(应用程序级网关技术)、PAT(NAPT,即网络地址端口转换),这里着重解释下PAT。

PAT(NAPT,即网络地址端口转换):
可将多个内部地址映射为一个合法公网地址,但以不同的协议端口号与不同的内部地址相对应,也就是<内部地址+内部端口>与<外部地址+外部端口>之间的转换。NAPT普遍用于接入设备中,它可以将中小型的网络隐藏在一个合法的IP地址后面。PAT(NAPT)也被称为“多对一”的NAT。PAT(NAPT)的主要优势在于,能够使用一个全球有效IP地址获得通用性。主要缺点在于其通信仅限于TCP或UDP。

端口映射(手动):
端口映射是NAT的一种,就是将内网中的主机的一个端口映射到外网主机的一个端口,提供相应的服务。当用户访问外网IP的这个端口时,服务器自动将请求映射到对应局域网内部的机器上。比如,我们在内网中有一台Web服务器,但是外网中的用户是没有办法直接访问该服务器的。> 于是我们可以在路由器上设置一个端口映射,只要外网用户访问路由器ip的80端口,那么路由器会把自动把流量转到内网Web服务器的80端口上。并且,在路由器上还存在一个Session,当内网服务器返回数据给路由器时,路由器能准确的将消息发送给外网请求用户的> 主机。在这过程中,路由器充当了一个反向代理的作用,他保护了内网中主机的安全。端口映射可以实现外网到内网和内网到外网双向的通信。
动态端口映射:其实就是PAT网关的工作方式,即一个公网IP,通过多个不同端口来映射内网设备,当没有连接时,映射将会取消,再次连接时再自动分配一个映射端口。
静态端口映射: 就是在NAT网关上开放一个固定的端口,然后设定此端口收到的数据要转发给内网哪个端口上,不管有没有连接,这个映射关系都会一直存在。
应用场景:
1.动态端口映射最典型的场景就是运营商对家庭宽带内网上网,有兴趣可以百度NAT相关知识。
2.静态端口映射可以映射内网中任意一台计算机的任意一个服务,适用于要映射的服务端口分散在几个机器上,且数量不多的时候,一般用于企业或公网家庭宽带中的web服务器或其他服务器对外端口较少的场景以及PT。这里要注意被映射端口所在主机做好与内网其他机器的通信防护,以防黑客入侵到此映射主机后继而破坏内网其他主机。

私有地址网段如下
A、B、C类地址的默认子网掩码分别是255.0.0.0、255.255.0.0、255.255.255.0

类型 范围
A类网段(1个) 10.0.0.0 ~ 10.255.255.255
B类网段(16个) 172.16.0.0 ~ 172.31.255.255
C类网段(256个) 192.168.0.0 ~ 192.168.255.255

注意:普通路由器在转发数据报时不改变其源IP地址和目的IP地址。而NAT路由器转发IP数据报时一定要更换其IP地址。普通路由器工作在网络层,而NAT路由器工作在网络和传输层(需要查看和转换端口号、IP)。

动态主机配置协议(DHCP)(应用层)

Dynamic Host Configuration Protocol
用于给主机动态的分配IP地址,属于应用层协议,基于UDP。

DHCP原理:使用C/S方式。需要IP地址的主机在启动时就向DHCP服务器广播发送发现报文,这时该主机就成为客户端。
使用广播的方式原因:因为DHCP执行期间客户端与服务端都不知道对方的IP地址
采用UDP协议的原因:因为不知道IP所以不能通过套接字建立连接

五、数据链路层

数据链路层具体功能

  1. 封装成帧

网络层的IP数据报(分组)传送到数据链路层就会成为帧的数据部分。封装成帧就是在数据前后分别添加首部和尾部,这样就构成一个帧。首部和尾部一个重要作用就是进行帧定界
数据链路帧.png

  1. 透明传输

数据中可能会出现于帧定界部分相同的比特组合,因而错误的认为“传输结束”而丢弃后面的的数据。确切的说透明传输就是不管传输数据是什么样的比特组合,都应该能在链路上正确传输。

  1. 流量控制

由于数据收发双方的处理能力和缓存空间的差异,可能会出现发送发的发送能力大于接收方的接受能力的现象,若是不限制发送方二点发送速率,前面的数据帧可能会被后面的数据“淹没”,造成帧丢失。

因此流量控制实际上是数据接收方限制发送方的发送速率,使发送速率不超过接收方的接受能力。

  1. 差错控制:

由于信道噪声等影响,帧在传输过程中可能会出现错误。用以使发送方确定接收方是否正确收到由其发送的数据的方法称为差错控制。

通常传输的错误可以分为位错帧错。

位错是指数据帧中某些位发生了错误。在数据链路层通常采用循环冗余校验(CRC)方式发现错位。实际上CRC具有纠错功能,但是一般只使用它的校验功能。

帧错是指帧的丢失、重复、失序等错误。在通信质量较差的无线传输链路,数据链路层协议使用确认和重传机制,向上提供可靠的服务。在通信质量良好的有线传输链路,数据链路层不提供确认和重传机制,而是仅由传输层(TCP)来实现确认与重传。

MTU的概念

MTU(Maximum Transfer Unit)是数据链路所能传送的帧的数据部分长度上限(最大传输单元),一般是1500字节。
数据链路帧.png

PPP(Point-to-Point Protocal)协议

MAC地址的作用

MAC地址是一个硬件地址,用来定义网络设备的位置,主要由数据链路层负责。

数据链路层交互过程

网络层等在数据链路层用MAC地址作为通信目标,数据包到达网络层等往数据链路层发送时:
首先去ARP缓存表去查找ip对应的MAC地址,如果查到,就将此ip对应的MAC地址封装到链路层数据包的包头。如果缓存中没有找到,则会发起一个广播,who is ip xxx tell ip xxxx,所有收到广播的机器看到这个ip是不是自己的,如果是自己的,则以单播的形式将自己的mac地址回复给请求机器。

六、物理层

七、网络安全

SYN泛洪攻击

常见加密与校验算法

  • AES加密

高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥,具体的加密流程如下图:
image.png

  • RSA加密

Ron Rivest、Adi Shamir、Leonard Adleman三人题提出,名字首字母
RSA加密算法是一种典型的非对称加密算法,它基于大数的因式分解数学难题,它也是应用最广泛的非对称加密算法。
非对称加密是通过两个密钥(公钥-私钥)来实现对数据的加密和解密的。公钥用于加密,私钥用于解密。
image.png
image.png

  • CRC校验

循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或电脑文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。

  • MD5校验与加密

MD5常常作为文件的签名出现,我们在下载文件的时候,常常会看到文件页面上附带一个扩展名为.MD5的文本或者一行字符,这行字符就是就是把整个文件当作原数据通过MD5计算后的值,我们下载文件后,可以用检查文件MD5信息的软件对下载到的文件在进行一次计算。两次结果对比就可以确保下载到文件的准确性。 另一种常见用途就是网站敏感信息加密,比如用户名密码,支付签名等等。随着https技术的普及,现在的网站广泛采用前台明文传输到后台,MD5加密(使用偏移量)的方式保护敏感数据保护站点和数据安全。

数字证书

对称加密和非对称加密的区别和原理

对称密钥加密是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全地将密钥发给对方;

而非对称加密是指使用一对非对称密钥,即公钥和私钥,公钥可以随意发布,但私钥只有自己知道。发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用自己的私钥进行解密。

由于非对称加密的方式不需要发送用来解密的私钥,所以可以保证安全性;但是和对称加密比起来,它比较慢,所以我们还是要用对称加密来传送消息,但对称加密所使用的密钥我们可以通过非对称加密的方式发送出去。