计算机网络(测试开发面试题总结)
协议层及其服务模型
Q:为什么要分层?
A:因为Internet非常复杂。 对于复杂的系统,分层有以下几点好处:
- 使其结构非常清晰,清楚地知道各层之间的关系;
- 模块化会使系统的维护、升级更见简化,改变某一层服务的具体实现对系统其他部分透明(不影响)。
But: 分层也有弊端,因为每一层可能都要重复较低层的功能。
参考模型
- ISO/OSI七层参考模型:
层号 | 层的名称 |
---|---|
7 | 应用层 |
6 | 表示层 |
5 | 会话层 |
4 | 传输层 |
3 | 网络层 |
2 | 数据链路层 |
1 | 物理层 |
- TCP/IP参考模型:
层号 | 层的名称 |
---|---|
5 | 应用层 |
4 | 传输层 |
3 | 网络层 |
2 | 数据链路层 |
1 | 物理层 |
- 两种参考模型:ISO/OSI是理论上的标准,TCP/IP是事实上的标准。
网际协议栈
- 应用层:支持网络应用,报文传送。
HTTP,FTP,SMTP,STTP
- 传输层:主机进程间数据段传送。
TCP,UDP
- 网络层:主机(源目标节点)间分组传送。
IP协议,路由协议
- 数据链路层:相邻网络节点间的数据帧传送。
PPP,Ethernet,……
- 物理层:物理介质上的比特传送
应用层
网络应用程序体系结构
1. 客户机/服务器体系结构
- 服务器主机总是打开
- 服务器具有固定的、众所周知的IP地址
- 客户机具有动态的IP地址
- 客户机之间不能通信
2. P2P体系结构
- 没有总是打开的服务器
- 任意一对主机之间可以直接通信
- 对等方间歇连接,可以改变IP地址
3. 客户机/服务器和P2P混合体系结构
- 文件在对等方之间相互交换、文件搜索通过服务器
- 两个聊天用户之间是P2P、注册和查询通过服务器
HTTP协议
网页由许多对象组成,每一个对象都被一个URL(统一资源定位符)寻址:
I. 什么是HTTP协议?
HTTP,超文本传输协议,Web的应用层协议,采用客户机/服务器的模式。协议的本质是对信息传输内容和顺序的约定。HTTP协议就约定了客户端与服务器之间通信的标准。
HTTP是无状态协议,服务器不维护客户先前的状态信息。也就是说:如果客户机第一次登录并且成功后,再第二次登录,服务器仍然不会知道当前请求的是哪个用户。
II. HTTP连接
- 非持久HTTP连接:每个TCP连接只传送一个对象,下载多个对象需要创建多个TCP连接,HTTP/1.0使用非持久HTTP连接。
- 持久HTTP连接:一个TCP连接可传送多个对象,HTTP/1.1默认使用持久HTTP连接。
III. HTTP报文格式
a. HTTP请求报文:
sp:空格,cr:回车,lf:换行,URI:统一资源标识符
URI与URL的区别: URL是URI的子集,它们都定义了资源是什么。但有区别:URI可以唯一标识该对象,而URL不仅可以唯一标识该元素,还可以定位到它
,所以叫统一资源定位符。举例:身份证号是URI,身份证地址+姓名是URL。
HTTP请求报文示例:
- HTTP/1.0方法:
GET:从服务器获取指定数据
POST:向服务器传送指定数据
HEAD:服务器收到请求时返回响应消息只包含HEAD头部
,不包含请求对象主体 - HTTP/1.1方法:
GET、POST 、HEAD
PUT:文件在实体主体中被上载到URL指定的路径
DELETE:删除URL字段指定的文件
GET方法 vs POST方法:
- 本质定义。GET是从服务器获取数据,POST是把需要处理的数据提交到服务器上。
- 安全性。GET方法将请求的数据加在URL后,用 ? 分隔URL和请求数据,多个参数用 & 连接,地址栏中可见,所以非常不安全;POST方法要传送的数据在请求包的实体中,地址栏中不可见,比GET更安全。
- 传输数据大小。由于GET方法中请求的数据在URL后面,而URL长度是有限制的,不能超过
2KB
,因此GET传输的数据较少并且有限;但POST对数据大小没有限制
。 - 有害性。浏览器后退或者刷新,GET方法不会产生什么动作,也就是不会修改服务器数据,但POST会重新提交数据给服务器。
b. HTTP响应报文:
HTTP响应状态码:
HTTP响应状态码位于HTTP响应报文的第一行,常见的状态码有:
- 200 OK 请求成功,响应消息返回所请求的对象
- 204 No Content 请求成功,但是没有数据。一般用在:只需要返回是否成功的情况。
- 301 Moved Permanently 请求对象已永久迁移,新的URL 在响应首部用字段
Location:
指出,浏览器接受到带Location头的响应时,就会跳转到相应的地址。 - 302 表示临时重定向。请求对象暂时迁移,新的URL 在响应首部用字段
Location:
指出,浏览器接受到带Location头的响应时,就会跳转到相应的地址。 - 400 Bad Request 该请求不能被服务器解读
- 403 Forbidden 拒绝访问。没有权限访问此网站。
- 404 Not Found 服务器上不存在所请求的对象
- 500 内部服务器错误。
- 502 Bad Gateway 错误的网关。可能是后端服务器tomcat没有起来,应用服务的问题;也可能是连接超时,向服务器发送请求时由于服务器当前链接太多,导致服务器方面无法给于正常的响应。
- 505 HTTP Version Not Supported
Q: 什么是无效链接?
无效链接即死链接。也就是那些不可到达
的链接。通俗地理解是以前可以通过点击这个链接到达网站页面,后续可能由于网站迁移、改版或操作不当等原因,使得链接指向的目标页面不存在而无法访问所遗留的链接,即称为死链接。访问死链接时,一般会出现“抱歉,您所访问的页面不存在”的提示信息或者 404
状态页面。
IV. HTTP常见首部行:
请求报文:
- Host:请求的目标域名和端口号
- User-agent:向服务器发送浏览器的版本、系统、应用程序信息
Cookie
:当前域名下的cookie数据- Accept-language:向服务器声明客户机接收的语言版本
- Connection:告诉服务器采用什么连接方式,例如Connection: Close 关闭默认的HTTP持久连接(用于HTTP/1.1)
响应报文:
- Connection
- Date:服务器发送资源时的服务器时间
- Server:HTTP服务器的应用程序信息
Location
:重定向,让客户端跳转到新的URL进行访问Last-Modified
:服务器发来的当前资源的最后一次修改时间
,如果下一次请求时,服务器上当前资源的修改时间比这个大(更晚),就返回新的资源内容。- Content-Length:消息实体的传输长度
- Content-Type:响应体的媒体资源类型(比如html类型,UTF-8编码等等)
V. HTTP vs HTTPS
HTTP:是超文本传输协议,是以明文
方式传输数据的,没有提供任何数据加密,并且不会验证通信方的身份。
HTTPS:是安全套接字层超文本传输协议,是由SSL + HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP更加安全。
注意: HTTPS协议并非是应用层的一种新的协议,只是在HTTP通信接口部分用SSL协议代替
而已。原本HTTP与TCP之间直接进行通信,但加入SSL后就先是HTTP与SSL进行通信,再是SSL与TCP进行通信。
HTTP与HTTPS的区别:
- HTTPS协议需要到CA(电子认证服务)申请证书。
- HTTP是超文本传输协议,HTTPS是更安全的SSL加密传输协议。
- 使用完全不同的连接方式,端口也不同,HTTP使用
80端口
,而HTTPS使用443端口
。 - HTTP连接很简单,是无状态的;HTTPS是由
SSL + HTTP
构建的可进行加密传输、身份认证的更安全的网络协议。
VI. SSL协议
SSL:位于TCP/IP协议与各种应用层协议之间。
- SSL协议基本内容
- SSL记录协议:建立在可靠传输协议的基础之上(如TCP),为高层协议提供数据封装、压缩、加密等基本功能。
- SSL握手协议:建立在SSL记录协议之上,在数据传输之前,双方进行身份验证、协商加密算法、交换加密密钥等。
- SSL协议原理
公钥加密法
。客户端向服务端索要公钥,收到后用自己的私钥加密信息,服务端收到密文后用自己的私钥解密。
注意: 1999年把SSL协议标准化改名为TLS(传输层安全协议),但这两者其实是同一种协议,只是不同阶段的称呼而已。
Cookie和Session
- cookie:因为HTTP请求是无状态的,它不会认识当前的用户是谁。cookie的出现就为了解决这个问题。用户第一次请求服务器时,服务器会返回一些数据(cookie)给浏览器,浏览器保存到本地,等下一次再请求服务器时就会
自动带上本地的cookie数据
,服务器拿到这个数据就知道该请求用户是谁了。但是cookie只能存少量数据,不同浏览器存储大小不同,但一般不超过4KB。 - session:session和cookie的作用类似,都是为了保存用户相关的信息,但是不同的是:
session是保存在服务器上的
,cookie保存在本地浏览器
。保存在服务器上的session数据不容易被窃取,更加安全,但弊端是占用了服务器的资源。
DNS:域名系统
I. DNS是什么?
DNS,全称为Domain Name System,域名系统。是因特网的目录服务,主机、路由器有多种标识符,包括主机名和IP地址。主机名是为了方便人类记忆创建的,是拿给人看的,而IP地址才是用于分组寻址的 ,因为它是固定的长度:
32bit
,更加规范、路由器更加容易接受。所以我们需要一个转换器,来将主机名转换成IP地址。这时候DNS的作用就出现了,当然,DNS不仅只有这个功能。
- 从实体上来看:是一种由分层DNS服务器实现的分布式数据库
- 从协议上来看:是一种实现域名转换的应用层协议
II. DNS提供什么功能?
- 提供主机名到IP地址映射的查询服务 (核心功能)
- 提供主机别名服务。 一个复杂的主机可能有一个
规范主机名
和多个主机别名,主机别名比规范主机名更容易记忆。DNS提供根据主机别名查找规范主机名的服务。 - 邮件服务器别名
- 负载分配。 对于被频繁访问的大型站点来说,它可能有多台服务器,那这时主机与IP地址就不再是一一对应了,而是
一个主机名对应多个IP地址
。在大量的、连续多次访问中,DNS通过旋转IP地址来实现负载均衡。
当客户机进行DNS请求时,DNS服务器便会把全部的IP地址放在响应报文中进行应答,但在不同的回答中它会旋转这些IP地址的顺序,客户机总会向排在最前面的IP地址
发出请求。
III. DNS服务器:
- 根DNS服务器: 因特网上有13个根DNS服务器,其中大部分分布在美洲。
- 顶级DNS服务器: 负责顶级域名
edu, gov, org, com
等和所有国家的顶级域名uk, fr, cn, jp
(edu教育机构域名,gov政府部门域名,org非盈利性的组织,com企业域名,uk英国,fr法国,cn中国,jp日本) - 权威DNS服务器: 在因特网上具有公共可访问主机(如Web服务器和邮件服务器)的每个组织机构必须提供公共可访问的DNS记录,这些记录将这些主机的名字映射为IP地址。组织机构的权威DNS服务器负责保存这些DNS记录。多数大学和公司维护它们的基本权威DNS服务器。
- 本地DNS服务器:
严格来说并不属于DNS服务器的层次结构
,它起到一个代理的作用,将主机提交的请求转发到层次结构中。
IV. DNS如何工作的?
DNS有两种查询方式:递归查询
和迭代查询
,从主机到本地DNS服务器是递归查询,本地DNS服务器向另外三个服务器的查询是迭代查询。
我们以该图为例,来描述DNS的查询过程,一共8条路径(8份报文):
(主机cis.poly.edu想要查询主机gaia.cs.umsaa.edu的IP地址)
- 主机
cis.poly.edu
向本地DNS服务器发送查询报文 - 本地DNS服务器收到后向根DNS服务器
转发
查询报文 - 根DNS服务器注意到
edu
域名,返回负责edu的顶级DNS服务器的IP地址
- 本地DNS服务器根据收到的IP地址查询顶级DNS服务器
- 顶级DNS服务器注意到
umass.edu
域名,返回负责umass.edu的权威DNS服务器的IP地址
。该权威DNS服务器是负责马萨诸塞大学的dns.cs.umass.edu
- 本地DNS服务器根据收到的IP地址查询权威DNS服务器dns.cs.umass.edu
- 权威DNS服务器dns.cs.umass.edu将使用
gaia.cs.umass.edu
的IP地址
作为响应,返回给本地DNS服务器 - 本地DNS服务器将 包含所查询IP地址的报文 返回给主机
cis.poly.edu
由此可见, 在迭代查询过程中,被查询的名字服务器回复可以被查询的名字服务器的IP地址。也就是说,它总是在告诉本地DNS服务器:“我不知道它的名字,但是你可以问服务器xxx”
。
传输层
传输层服务
在两个不同的主机上运行的应用程序之间提供的逻辑通信。
传输层协议运行在端系统:
发送方:
将应用程序报文分成数据段
发送给网络层
接收方:
将数据段重新整理成报文
发送给应用层
UDP协议
I. 什么是UDP协议?
UDP:用户数据报协议,是一种无连接
的传输协议。它只在IP数据报服务之上提供很少一点的功能:即 端口功能 和 差错检测功能 。所以它是“无修饰”、“不加渲染”、“尽最大努力”服务,因此可能会出现的问题:
- 丢失
- 报文失序
- UDP的
无连接
体现在:
- 接收者与发送者之间没有握手;
- 每一个UDP数据段的处理独立于其他的数据段(支持一对一、一对多、多对一的数据通信)
- 从UDP可能出现的问题看起来它很糟糕,那为什么它依然存在并使用着?(优点)
- 不需要建立连接,所以能减少延迟;
- 要求简单,发送者与接收者之间不需要保持连接状态;
- 很小的数据段首部;
- 没有拥塞控制,会以尽可能快的速度传输
II. UDP用户数据报
UDP用户数据报包含两个字段:UDP首部字段
+ 数据字段
。其中首部长度为8个字节,包含:
16位源端口 | 16位目的端口 |
---|---|
16位UDP长度 | 16位UDP校验和 |
- 端口:是应用层和传输层的服务接口
- UDP长度:
首部 + 数据
总长度 - UDP校验和:伪首部、首部、数据 三部分的校验和
- 伪首部:它并不是在UDP数据报中存在的有效数据,也不会被发送,它的存在
仅是为了计算校验和
,所以叫做伪首部。它是提取了源IP地址、目的IP地址等字段构造的数据。
III. UDP的校验和
发送方:
- 将数据段看作
16bit
的整数数列, - 校验和:数据段内容相加、变反
- 将校验和放在UDP首部的校验和域中
接收方:
- 计算接收到的数据的校验和
- 检查该校验和是否等于校验和域中的值
注意,即使没有检查到错误,也有可能是错的。差错检测并不是100%可靠,但是尽可能提供了大概率的检错能力。
计算校验和示意图:
TCP协议
I. 什么是TCP?
TCP是面向连接的
、可靠的
、基于字节流的
传输协议。它提供的功能和特性:
- 一对一,即一个发送者、一个接收者
- 可靠按序的字节流
- 流水线:TCP拥塞控制和流量控制设置窗口大小
- 收发缓冲区
- 全双工数据:同一个连接上的双向数据流
- 面向连接:在数据交换前握手,初始化发送方和接收方的状态
- 流量控制:发送方不会淹没接收方
II. TCP报文段
第一行:
- 源端口和目的端口——各占2字节。端口是应用层与传输层的服务接口。
第二行:
序号——占4字节
。TCP连接传输的数据流中的每一个字节都会被编上一个序号。而这里的序号字段指的是发送的数据段中第一个字节的序号。
第三行:
确认号——占4字节
。是期望收到对方下一次发来的序号字段的值。
第四行:
- 数据偏移(即首部长度)——占4bit。数据偏移的单位为:32位的字(即以4字节为单位,因为首部字段中的一行就是4字节)
- 保留字段——占6bit。保留为今后可能的使用,目前设置为0。
- 紧急URG(URGent)——当URG=1时,表明紧急指针字段(第五行的) 有效,说明此报文段中有非常紧急的数据,需要尽快传送。
确认ACK
——当ACK=1时确认号(第三行的) 有效,当ACK=0时确认号无效。- 复位RST——当RST=1时,表明TCP连接中出现严重差错(比如主机崩溃等),必须马上释放连接,重新建立新的连接。
同步SYN
——当SYN=1时,表明这是一个连接请求或者连接接受报文。终止FIN
——当FYN=1时,表明此报文段的发送方的数据已发送完毕,并且要求释放连接。- 窗口字段——占2字节。包含
滑动窗口
和拥塞窗口
,后面详解。
第五行:
校验和——占2字节
。包括首部校验和数据校验两部分。在计算校验和的时候要在TCP报文段前面加上12字节的伪首部。紧急指针——占2字节
。指出本报文段中紧急数据共有多少字节。(紧急数据放在本报文段数据的最前面)- 填充字段——为了使整个首部的长度是4字节的整数倍。
TCP三次握手(3Q)
Q1: 为什么是三次握手,不是两次?
防止失效的连接请求报文段又传回到主机B。
假定是两次握手:主机A发送一个连接请求给主机B,但是它在网络节点滞留了,没有收到确认,所以A就又发送了一个连接请求,这一次主机B收到了SYN确认,并且发送ACK确认号给主机A,于是它们俩建立了连接并传输数据。当数据传输完毕后,它们关闭了连接。而此时,失效的连接请求
可能又重新传到了主机B,它以为主机A又想跟它连接了,于是就发送ACK确认号,如果是两次握手的话那么连接就建成了,主机B于是开始一直等待主机A传输数据,但是事实上A并不知道它们在连接,所以会导致主机B浪费了它的资源。
Q2: 搜索敏感词汇时,页面被重置的原理
关键字检测,针对明文或者base64等弱加密通讯内容,与准备好的敏感词库进行匹配,当发现敏感词时,将服务器发回的SYN/ACK, 确认号:x+1
包改成SYN/ACK, 确认号:0
, 这代表TCP连接被重置,用户便主动放弃了连接,提示连接失败。让用户误认为服务器拒绝连接,而主动放弃继续与服务器连接,自动阻断记录含有敏感词的网页。
Q3: 浏览器输入域名发生了什么?(Web页面请求过程)
- 浏览器会从主机的
Hosts
文件中查看是否有该域名和IP地址的映射; - 如果Hosts文件没有,浏览器会查看自己的
缓存
; - 当上面两个方法都行不通时,只能去请求
DNS服务器
来获取IP地址; - 获取到IP地址后,建立
TCP连接
、三次握手; - 确认连接后发送一个
HTTP请求报文
; - 服务器处理请求,并对请求做出
响应
; - 浏览器收到服务器响应,得到
html
代码; 渲染
页面。(浏览器根据响应报文来解析CSS样式、JS交互等等)
TCP四次挥手(3Q)
Q1: 发送FIN终止字段表明没有数据可发了,那为什么还要发送指示数据的序号字段呢?
因为当客户机/服务器发送FIN字段后,它还希望收到服务器/客户端发来的确认信息,那么如何指定接收的那条确认信息的序号呢?就得先在发送FIN时就初始化本数据段的序号,而这个数据段里面的数据部分是特殊的一字节。
Q2: 关闭连接时,为什么客户端最后还要等2MSL的时间?
MSL(Maximum Segment Lifetime):报文段最大生存时间。是任何IP数据报在因特网中存活的最大时间,超过这个时间IP数据报就会被丢弃,TCP允许设置不同的MSL值。实际中的常用值一般是30s,1min,2min。等待2MSL有两个好处:
- 保证TCP协议的全双工连接能够可靠关闭。
保证客户端发送的最后一个ACK数据段能够到达服务器
。因为这个ACK有可能丢失,那么服务器收不到确认号,它就会再发送一次FIN,而客户机就能在这2MSL的时间中收到服务器传来的报文,再给出ACK回应,此时会重启2MSL计时器。 - 保证本次连接的重复数据段从网络中消失。防止在“三次握手”中提到的“失效的连接请求段又重新回到主机B”出现在本连接中。因为在传输过程中有可能存在
滞留的数据段
,如果客户机发送完最后一个ACK就直接关闭了,然后立马开启一个新的连接,而如果这个新连接的端口号恰好和刚刚是一样的,那么当建立了新连接之后,上一次连接中滞留的数据段可能会再到达服务器,而服务器就会以为它是这一次连接中发送的数据,然而并不是。所以需要等待2MSL,使本次连接网络中滞留的数据段全部消失。
Q3: 为什么是四次挥手?
从上面两幅图中可以看出,四次挥手和三次握手最大的区别在于中间部分,建立连接
时服务器端发送确认号是把SYN和ACK放在一个数据段中发送,而关闭连接
时ACK和FIN是分成两个数据段传送的。所以关闭连接就比建立连接多出一个数据报。那为什么关闭连接时不能也把ACK和FIN合在一起传送呢?原因是,当客户机发起关闭连接时,仅仅表示它不再传送数据了,但它仍可以接收数据,而这时服务器可以立即关闭,也可以在发送剩余的数据之后再传送FIN字段来关闭,所以说ACK和FIN往往需要分开发送。
TCP拥塞控制(1Q)
先注意!拥塞控制 ≠ 流量控制
-
什么是流量控制?
TCP连接的接收方有一个接收缓冲区
。应用程序可能从这个缓冲区读出数据很慢
,因此需要保证发送速率和接收应用程序的提取速率匹配
,发送方不能发送的太多太快,让接收缓冲区溢出。流量控制使用接收窗口(即接收缓冲区的剩余空间),接收方在报文段中宣告接收窗口的剩余空间,发送方需要限制没有被确认的数据不能超过接收窗口,从而保证接收缓冲区不溢出
。
滑动窗口:接收
数据端使用的窗口大小,用来告知发送端它的缓存大小,以此可以控制发送端发送数据的大小,从而达到流量控制的目的。(由于TCP是全双工链接,因此发送方和接收方都有滑动窗口) -
什么是拥塞控制?
从信息角度看,拥塞是:“太多源主机发送太多的数据,速度太快以至于网络来不及处理”。表现为:丢失分组
(路由器的缓冲区溢出)、长延迟
(在路由器的缓冲区排队)
拥塞窗口:发送
数据端使用的窗口大小,拥塞窗口不代表缓存,拥塞窗口指某一源端数据流在一个RTT内可以最多发送的数据包数
。
拥塞控制是防止过多的数据注入网络
中,这样可以使网络中的路由器或链路
不致过载。拥塞控制是一个全局性的过程,和流量控制不同,流量控制指点对点通信量
的控制。
TCP的四种拥塞控制算法:
I. 慢启动:
当主机开始发送数据时,如果立即将大量数据字节注入到网络,那么就有可能因为不清楚当前网络的负荷情况而引起网络阻塞。所以,最好的方法是先探测一下
,即由小到大逐渐增大发送窗口
,也就是说,由小到大逐渐增大拥塞窗口数值。通常在刚刚发送报文段时,先把拥塞窗口cwnd设置为 1 个最大报文段MSS的数值。而在每收到一个新的报文段的确认后,把拥塞窗口增加至多一个MSS的数值(1个确认报文对应2个MSS,即:呈指数增长)。用这样的方法逐步增大发送方的拥塞窗口cwnd,可以使分组注入到网络的速率更加合理。
注意:慢开始当中的“慢”并不是指cwnd的增长速率慢,而是在TCP开始发送报文段时先设置cwnd = 1
,使得发送方在开始时只发送一个报文段。
II. 拥塞避免:
让拥塞窗口cwnd缓慢的增大
,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd + 1
,而不是加倍,即:呈线性增长。这样拥塞窗口cwnd按线性规律缓慢的增长,比慢开始算法的拥塞窗口增长速率缓慢的多。
AIMD(加法增大乘法减小):
- 加法增大:当网络频发出现超时情况时,ssthresh就下降的很快,为了减少注入到网络当中的分组数,在执行
拥塞避免
算法时,使拥塞窗口缓慢的增大
,以防止网络过早出现拥塞。 - 乘法减小:无论在慢启动阶段还是在拥塞避免阶段,只要网络出现
超时
,就将cwnd置为1
,sthresh置为cwnd的一半
,然后开始执行慢启动
算法。
III. 快重传:
所谓快重传,就是使发送方尽快进行重传
,而不是等超时重传计时器超时再重传。
- 要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认;
- 即使收到了
失序
的报文段也要立即发出对已收到的报文段的重复确认。 - 发送方一旦收到
3个连续的重复确认
,就将相应的报文段立即重传,而不是等该报文段的超时重传计时器超时再重传。 - 对于个别丢失的报文段,发送方不会出现超时重传,也就不会误认为出现了拥塞(进而降低拥塞窗口cwnd为1)。使用快重传可以使整个网络的
吞吐量提高
约20%。
IV. 快恢复:
发送方一旦收到3个重复确认,就知道现在只是丢失了个别的报文段
。于是不启动
慢开始算法,而执行快恢复算法;发送方将慢开始门限ssthresh
值和拥塞窗口cwnd
值调整为当前窗口的一半
;开始执行拥塞避免算法。(阈值ssthresh的作用是:当下一次出现超时,慢启动到阈值后开始启动拥塞避免。)
也有的快恢复实现是把快恢复开始时的拥塞窗口
cwnd值再增大一些, 即等于新的ssthresh + 3
。因为:
- 既然发送方收到3个重复的确认,就表明有3个数据报文段已经
离开了网络
; - 这3个报文段
不再消耗网络资源
而是停留在接收方的接收缓存中; - 可见现在网络中不是堆积了报文段而是减少了3个报文段。因此可以适当把拥塞窗口扩大些。
对于TCP Tahoe
版本:(已经废弃)
- 无论
超时
还是收到三个重复的确认
,都直接将拥塞窗口置为1个 MSS
。(仅有慢启动和拥塞避免)
对于TCP Reno
版本:
- 当
超时
事件发生时:- 拥塞窗口立即设置为
1个 MSS
; - 窗口开始
指数增长
(进入慢启动); - 到达一个阈值后再
线性增长
(拥塞避免)
- 拥塞窗口立即设置为
收到三个重复的确认
时:- 拥塞窗口
减半+3
(快恢复); - 然后,窗口
线性增长
(拥塞避免)
- 拥塞窗口
Q: 什么时候应该使用TCP?什么时候应该使用UDP?
- TCP:当对网络通讯
质量
有要求的时候,比如:整个数据要准确无误
的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。 在日常生活中,常见使用TCP协议的应用如下:浏览器、采用FTP的Outlook,采用SSH的QQ文件传输…… - UDP:当对网络通讯
质量要求不高
的时候,要求网络通讯速度能尽量的快
,这时就可以使用UDP。比如,日常生活中,常见使用UDP协议的应用如下: QQ语音、QQ视频……
网络层
网络层功能
发送方:
传输报文段到接收方主机
接收方:
将收到的报文段递交给传输层
在每个主机、路由器上都需要运行网络层协议。路由器会检查通过它的所有IP数据报的头部字段,然后根据目的IP地址对数据报进行转发。
网络层提供的两个主要功能:
- 转发(forwarding): 将分组从路由器的
输入端口
转移到正确的路由器输出端口
- 路由(routing): 确定分组从
发送方
传输到接收方
(目的主机)所经过的路径(或路由)
网际IP协议(1Q)
I. 什么是IP协议?
网际协议或互联网协议(Internet Protocol,IP)是用于报文交换网络的一种面向数据的协议,是网络层通信的标准协议,它负责提供基本的数据段传送功能,
让每一块数据段都能够到达目的主机,但不检查是否被正确接收
。
II. IP数据报格式
Q: TCP和UDP用一个端口发送信息是否冲突 ?
不会冲突。因为在IP数据报首部有“高层”
字段,它定义了传输层的协议。而客户机和服务器会根据IP数据报和TCP/UDP报文段中提供的:传输协议、源IP地址、目的IP地址、源端口、目的端口
来判别接收者。
III. IP 地址
IP地址:分配给主机或路由器接口的标识符。
IP地址有两种:IPV4和IPV6
- IPV4:32个二进制位长(4字节),常用点分十进制表示
- IPV6:128个二进制位长(16字节)常用冒号分隔表示
IV. 传统的IP地址分类
一些特殊的IP地址:
- 本地地址
127.0.0.1--127.255.255.254
这是预留的一组IP地址,主要是用来识别主机本身的地址。也叫做“localhost”,一般用来测试。 - 私有地址
10.x.x.x, 172.16.x.x--172.31.x.x, 192.168.x.x
这三个地址段被称为私有IP地址段,也就是局域网所使用的地址段,在公网上不能被路由。 0.0.0.0
这个地址严格上来说不是真正意义上的IP地址。主要是用来标识不清楚的网络和主机的。系统遇到无法识别的网络或主机的时候会统一的归纳到这个地址255.255.255.255
这个地址是受限的广播地址。主要指一个网段内的所有主机。
V. 划分子网
网络号相同的IP地址属于同一个网络。而网络还可以划分为若干子网。划分子网的方法是:从主机号借用若干个比特作为子网号,剩下的主机位为主机号。
子网掩码: 子网号字段长度是可变的,因此,为了确定子网地址,IP协议提供了子网掩码的概念 。
子网掩码用来确定网络地址(包括网络号和子网号)和主机地址的长度
。子网掩码长为32位比特,其中的1
对应于IP地址中的网络号和子网号
,而子网掩码中的0
对应于主机号
。
路由协议
- RIP: 路由信息协议
是一种比较简单的内部网关协议
,主要用于规模较小的网络,比如校园网以及结构较简单的地区性网络。对于更为复杂的环境和大型网络,一般不使用RIP。RIP是一种基于距离矢量(DV)算法的协议,它通过UDP报文进行路由信息的交换,使用的端口号为520。其使用跳数来衡量到达目的地址的距离,为了限制收敛时间,RIP规定度量值(该值等于从本网络到达目的网络间的路由器数量)为0到15
之间的整数,大于等于16的跳数将会定义为网络或主机不可达,因此RIP不适合大型网络。 - OSPF: 开放最短路径优先协议
属于链路状态路由协议
,OSPF提出了“区域(area)”的概念,每个区域中所有路由器维护着一个相同的链路状态数据库 (LSDB),其使用链路状态数据库,通过最短生成树算法(SPF算法) 计算得到路由表:存放从源节点到每个目的节点的最低费用路径上的下一跳节点。即指出对于发往某个目的节点的分组,从该节点发出后的下一个节点
。因此其收敛速度较快。目前OSPF协议在各种网络中广泛部署,目前针对IPv4协议使用的是OSPF Version 2(RFC2328);针对IPv6协议使用OSPF Version 3(RFC2740)。 - IGRP: 内部网关路由协议 (Cisco 所有)
属于Cisco的私有协议,最大跳数默认为100
。
数据链路层(2Q)
I. 数据链路层的职责
数据链路层是将数据报
从一个节点
传送到与该节点有直接的物理链路相连
的另一个节点。
另,数据报可以在不同的链路
上,通过不同的链路层协议
发送。每个链路层协议提供不同的服务:可以提供/也可以不提供可靠数据传输服务。
II. 链路层协议
-
Ethernet协议
以太网
是使用最广泛的局域网技术。由于其简单、成本低、可扩展性强、与IP网能够很好地结合等特点,以太网技术的应用正从企业内部网络向公用电信网领域迈进。以太网接入是指将以太网技术与综合布线相结合,作为公用电信网的接入网,直接向用户提供基于IP的多种业务的传送通道。以太网技术的实质是一种二层的媒质访问控制技术,可以在五类线上传送,也可以与其它接入媒质相结合,形成多种宽带接入技术。以太网与电话铜缆上的VDSL相结合,形成EoVDSL技术;与无源光网络相结合,产生EPON技术;在无线环境中,发展为WLAN技术。 -
frame relay协议
帧中继
(frame relay)是于1992年兴起的一种新的公用数据网通讯协议,1994年开始获得迅速发展。帧中继是一种有效的数据传输技术,它可以在一对一或者一对多的应用中快速而低廉
的传输数字信息。它可以使用于语音、数据通信,既可用于局域网(LAN)也可用于广域网(WAN)的通信。每个帧中继用户将得到一个接到帧中继节点的专线。帧中继网络对于端用户来说,它通过一条经常改变且对用户不可见的信道来处理和其他用户间的数据传输。 -
IEEE 802协议
IEEE 802 在保持以太网原有优点的基础上,引入或增强了自愈保护、优先级和公平算法、OAM等功能,是以太网技术的重要创新。 -
PPP协议
点对点协议
(Point to Point Protocol,PPP)为在点对点连接上传输多协议数据包提供了一个标准方法。PPP 最初设计是为两个对等节点之间的 IP 流量传输提供一种封装协议。在 TCP-IP 协议集中它是一种用来同步调制连接的数据链路层协议(OSI模式中的第二层),替代了原来非标准的第二层协议,即 SLIP。 -
ARP协议 (在OSI模型中ARP协议属于链路层;而在TCP/IP模型中,ARP协议属于网络层。)
地址解析协议
,即ARP(Address Resolution Protocol),是根据IP地址
获取物理地址
的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址
存入本机ARP缓存
中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。地址解析协议是建立在网络中各个主机互相信任
的基础上的,局域网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系、添加或删除静态对应关系等。相关协议有RARP、代理ARP。NDP用于在IPv6中代替地址解析协议。- ARP分层的位置是TCP/IP的网络层
- ARP报文是由以太网帧进行封装传输的,没有封装进IP包
- 实际上,对网络接口层的以太网帧来讲,它们同样是帧的上层协议,当收到以太帧时,根据帧的协议字段判断是送到ARP还是IP
- 之所以不把它放在数据链路层,是因为它并不具备数据链路层的功能,它的作用是
为数据链路层提供接收方的帧地址
-
RARP协议
反向地址转换协议
(RARP:Reverse Address Resolution Protocol)RARP允许局域网的物理机器从网关服务器的 ARP 表或者缓存上请求其 IP 地址
。网络管理员在局域网网关路由器里创建一个表以映射物理地址(MAC)和与其对应的 IP 地址。当设置一台新的机器时,其 RARP 客户机程序需要向路由器上的 RARP 服务器请求相应的 IP 地址。假设在路由表中已经设置了一个记录,RARP 服务器将会返回 IP 地址给机器,此机器就会存储起来以便日后使用。
Q1: APP链接点进后加载一段时间后仍无内容,分析可能的情况
- 网络信号差
- DNS解析慢
- 建立链接慢
当我们获取到服务器IP后,客户端和服务器建立连接,这个链接的速度与质量取决于线路的优劣
。最常见的问题就是跨线路访问,地理位置相差很远的访问,中继网络异常等。排查方法:如果ping一个网址,存在大量丢包或者很高延迟(国内ping延迟超过50ms),就会导致访问的连接线路异常。 - 服务器响应慢
当一个服务器健康运行,这个时间几乎可忽略,但是如果服务器不那么健康,比如CPU,内存,磁盘,带宽
,只要一个达到瓶颈的服务器就是亚健康,将直接影响访问速度。排查方法:如果此前访问很快的网站访问突然变慢了,在网络无问题的情况下,云主机可查看内部资源使用情况
;虚拟主机则可通过执行简单命令或直接访问图片来判断服务器资源占用情况。 - 本身问题,加载速度慢
加载时间慢可以说是最明显、最大程度
影响访问速度的因素了。当用户访问一个网站时候,服务器会向客户端发送大量的内容,这会占用大量的服务器带宽。带宽就是最常见也是最直接影响打开的因素。
Q2: 什么是防火墙?
防火墙对流经它的网络通信进行扫描,这样能够过滤掉一些攻击
,以免其在目标计算机上被执行。防火墙还可以关闭不使用的端口
。而且它还能禁止特定端口的流出通信
,封锁特洛伊木马。最后,它可以禁止来自特殊站点的访问
,从而防止来自不明入侵者的所有通信。