1 网络协议是什么?
在计算机网络要做到有条不紊地交换数据,就必须遵守一些事先约定好的规则, 比如交换数据的格式、是否需要发送一个应答信息。这些规则被称为网络协议
2 网络协议分层
对网络协议分层可以有下面的优点
简化问题难度和复杂度
。由于各层之间独立,我们可以分割大问题为小问题。灵活性好
。当其中一层的技术变化时,只要层间接口关系保持不变,其他层不受 影响
。易于实现和维护
。促进标准化工作
。分开后,每层功能可以相对简单地被描述。
网络协议分层的缺点: 功能可能出现在多个层里,产生了额外开销
3 TCP/IP 四层体系结构
3.1 应用层
应用层( application-layer )的任务是通过应用进程间的交互来完成特定网络应用
。
应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则
。
对于不同的网络应用需要不同的应用层协议
。在互联网中应用层协议很多,
3.2 运输层
运输层(transport layer)的主要任务就是负责向两台主机进程之间的通信提供通用的数据传输服务,应用进程利用该服务传送应用层报文
。
运输层主要使用一下两种协议:每一个应用层(TCP/IP参考模型的最高层)协议一般都会使用到两个传输层协议之一:
传输控制协议-TCP
:提供面向连接的,可靠的
数据传输服务。- 用户数据协议-UDP:提供
无连接的
,尽大努力的数据传输服务(不
保证数据传输的可靠
性)。
3.2.1 运行在TCP协议上的协议
HTTP
(Hypertext Transfer Protocol,超文本传输协议),主要用于普通浏 览
。
HTTPS
(HTTP over SSL,安全超文本传输协议),HTTP协议的安全版本
。
FTP
(File Transfer Protocol,文件传输协议),用于文件传输
。
POP3
(Post Office Protocol, version 3,邮局协议),收邮件
用。
SMTP
(Simple Mail Transfer Protocol,简单邮件传输协议),用来发送电子 邮件
。
TELNET
(Teletype over the Network,网络电传),通过一个终端 (terminal)登陆到网络
。
SSH
(Secure Shell,用于替代安全性差的TELNET),用于加密安全登陆用
。
3.2.2 运行在UDP协议上的协议
BOOTP
(Boot Protocol,启动协议),应用于无盘设备
。
NTP
(Network Time Protocol,网络时间协议),用于网络同步
。
DHCP
(Dynamic Host Configuration Protocol,动态主机配置协议),动态 配置IP地址
。
3.2.3 运行在TCP和UDP协议上:
DNS
(Domain Name Service,域名服务),用于完成地址查找,邮件转发
等工作。
3.3 网络层
网络层的任务就是选择合适的网间路由和交换结点,确保计算机通信的数据及时传送
。
在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送,在TCP/IP 体系结构中,由于网络层使用 IP 协议,因此分组也叫 IP 数据报 ,简称数据报
。
互联网是由大量的异构(heterogeneous)网络通过路由器(router)相互连接起来的。
互联网使用的网络层协议是无连接的网际协议(Intert Prococol) 和许多路由选择协议
,因此互联网的网络层也叫做网际层或 IP 层。
3.4 数据链路层
数据链路层(data link layer)通常简称为链路层。
两台主机之间的数据传输
,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议
在两个相邻节点之间传送数据时,数据链路层将网络层交下来的 IP 数据报组装成帧
,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息 (如同步信息,地址信息,差错控制等)。
在接收数据时,控制信息
使接收端能够知道一个帧从哪个比特开始和到哪个比特结束。
具体传输过程情况这篇博客
通信传输流的一般过程
3.5 物理层
在物理层上所传送的数据单位是比特。
物理层(physical layer)的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异
。使其上面的数据链路层不必考虑网络的具体传输介质是什么。
**“透明传送 比特流”**表示经实际电路传送后的比特流没有发生变化,对传送的比特流来说, 这个电路好像是看不见的
。
4 TCP的三次握手四次挥手
TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,在发送数据 前,通信双方必须在彼此间建立一条连接。所谓的“连接”,其实是客户端和服 务端保存的一份关于对方的信息,如ip地址、端口号等。
TCP可以看成是一种字节流,它会处理IP层或以下的层的丢包、重复以及错误问 题。在连接的建立过程中,双方需要交换一些连接的参数。这些参数可以放在 TCP头部。
一个TCP连接由一个4元组构成,分别是两个IP地址和两个端口号
。一个TCP连接通常分为三个阶段:连接、数据传输、退出(关闭)。
通过三次握手建立一个链接,通过四次挥手来关闭一个连接
。
当一个连接被建立或被终止时,交换的报文段只包含TCP头部,而没有数据。
具体说明请看这篇博客
5 为什么TCP连接的时候是3次?2次不可以吗?
因为需要考虑连接时丢包的问题
如果只握手2次,
- 第二次握手时如果服务端发给客户端的确认报文段丢失,但是此时服务端已经准备好了收发数据(服务端已经连接成功),
- 而客户端一直没收到服务端的确认报文,所以客户端就不知道服务端是否已经准备好了(客户端未连接成功),
- 这种情况下
客户端不会给服务端发数据,也会忽略服务端发过来的数据
。
如果是三次握手,即便发生丢包也不会有问题,
- 比如如果第三次握手客户端发的确认ack报文丢失,
- 服务端在一段时间内没有收到确认ack报文的话就会重新进行第二次握手,(也就是服务端会重发SYN报文段),
- 客户端收到重发的报文段后会再次给服务端发送确认ack报文。
6 为什么TCP连接的时候是3次,关闭的时候却是4次?
只有在客户端和服务端都没有数据要发送的时候才能断开TCP。
- 而
客户端发出FIN报文时只能保证客户端没有数据发了
,服务端还有没有数据发客户端是不知道的。 - 而
服务端收到客户端的FIN报文后
,只能先回复客户端一个确认报文来告诉客户端我服务端已经收到你的FIN报文了,但服务端还有一些数据没发完,等这些数据发完了服务端才能给客户端发FIN报文
- 所以不能一次性将确认报文和FIN报文发给客户端,就是这里多出来了一次。
7 为什么客户端发出第四次挥手的确认报文后要等2MSL的时间才能释放TCP连接?
这里同样是要考虑丢包的问题,
- 如果第四次挥手的报文丢失,
服务端没收到确认 ack报文就会重发第三次挥手的报文
, - 这样
报文一去一回 长时间就是2MSL
, - 所以需要等这么长时间,来确认服务端确实已经收到了。
8 如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP设有一个保活计时器
,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。
- 服务器每收到一次客户端的请求后都会重新复位这个计时器,
时间通常是设置为2小时
, - 若两小时还没有收到客户端的任何数据,
- 服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。
- 若
一连发送10个探测报文仍然没反应
, - 服务器就认为客户端出了故障,接着就关闭连接。
9 什么是HTTP
HTTP 是一个在计算机世界里专门在两点之间传输
文字、图片、音频、视频等超文本数据的约定和规范
10 HTTP 与 HTTPS 的区别
11 常用HTTP状态码
HTTP状态码表示客户端HTTP请求的返回结果、标识服务器处理是否正常、表明请求出现的错误等
11.1 状态码的类别
11.2 常用HTTP状态码
12 GET和POST区别
浏览器和服务器的交互是通过HTTP协议执行的,而GET和POST也是HTTP协议中的两种方法
HTTP
全称为Hyper Text Transfer Protocol,中文翻译为超文本传输协议
,目的是保证浏览器与服务器之间的通信
。HTTP的工作方式
是客户端与服务器之间的请求-应答协议
。
HTTP协议中定义了浏览器和服务器进行交互的不同方法,基本方法有4种,分别是GET,POST,PUT,DELETE。这四种方法可以理解为,对服务器资源的查,改,增,删。
- GET:从服务器上获取数据,也就是所谓的查,仅仅是获取服务器资源,不进行修改。
- POST:向服务器提交数据,这就涉及到了数据的更新,也就是更改服务器的数据。
- PUT:英文含义是放置,也就是向服务器新添加数据,就是所谓的增
- DELETE:从字面意思也能看出,这种方式就是删除服务器数据的过程。
GET和POST区别
Get是不安全的
,因为在传输过程,数据被放在请求的URL中
;Post的所有操作对用户来说都是不可见的
。 但是这种做法也不是绝对的,大部分人的做法也是按照上面的说法来的,但是也可以在get请求加上 request body,给 post请求带上 URL 参数。Get
请求提交的url中的数据最多只能是2048字节
,这个限制是浏览器或者服务器给添加的
,http协议并没有对url长度进行限制
,目的是为了保证服务器和浏览器能够正常运行,防止有人恶意发送请求
。Post请求则没有大小限制
。Get限制Form表单的数据集
的值必须为ASCII字符
;而Post支持
整个ISO10646字符集
。Get执行效率却比Post方法好
。Get是form提交的默认方法。GET产生一个TCP数据包;POST产生两个TCP数据包
。对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
13 什么是对称加密与非对称加密
对称密钥加密
是指加密和解密使用同一个密钥
的方式,这种方式存在的最大问题
就是密钥发送问题,即如何安全地将密钥发给对方
;
非对称加密
是指使用一对非对称密钥,即公钥和私钥
,公钥可以随意发布,但私钥只有自己知道
。发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用自己的私钥进行解密。
非对称加密的方式不需要发送用来解密的私钥,所以可以保证安全性;但是和对称加密比起来,非常的慢
14 什么是HTTP2
HTTP2 可以提高了网页的性能
。
-
在
HTTP1
中浏览器限制了同一个域名下的请求数量
(Chrome 下一般是六个),当请求很多资源的时候,由于队头阻塞当浏览器达到最大请求数量
时,剩余的资源需等待当前的六个请求完成后才能发起请求。 -
HTTP2 中引入了多路复用
的技术,这个技术可以只通过一个 TCP 连接就可以传输所有的请求数据。多路复用可以绕过浏览器限制同一个域名下的请求数量的问题
,进而提高了网页的性能。
15 什么是cookie
cookie是由Web服务器保存在用户浏览器上的小文件(key-value格式),包含用户相关的信息。
- 客户端向服务器发起请求,如果服务器需要记录该用户状态,就使用response向客户端(浏览器)颁发一个Cookie。
- 客户端(浏览器)会把Cookie保存起来。
- 当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。
服务器检查该Cookie,以此来辨认用户身份
。
16 什么是session
session是依赖Cookie实现
的,session是服务器端对象
- session 是浏览器和服务器会话过程中,
服务器分配的一块储存空间
。 - 服务器默认为浏览器在cookie中设置 sessionid,
- 浏览器在向服务器请求过程中传输cookie 包含 sessionid ,
服务器根据 sessionid 获取出会话中存储的信息,然后确定会话的身份信息
。
17 cookie与session区别
存储位置与安全性:cookie数据存放在客户端上,安全性较差
,session数据放在服务器上,安全性相对更高
;
存储空间:单个cookie保存的数据不能超过4K
,很多浏览器都限制一个站点多保存20个cookie,session无此限制
占用服务器资源:session
一定时间内保存在服务器上,当访问增多,占用服务器性能
,考虑到服务器性能方面,应当使用cookie。
18 什么是Token
Token的引入:Token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示,在这样的背景下,Token便应运而生。
Token的定义:Token是服务端生成的一串字符串
,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。
使用Token的目的:Token的目的是为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮
。
Token 是在服务端产生的。
- 如果前端使用用户名/密码向服务端请求认证,服务端认证成功,
- 那么在服务端会返回 Token 给前端。
- 前端可以在每次请求的时候带上 Token 证明自己的合法地位
19 session与token区别
session机制存在服务器压力增大,CSRF跨站伪造请求攻击,扩展性不强等问题;
session存储在服务器端
,token存储在客户端
token提供认证和授权功能,作为身份认证,token安全性比session好
;
session
这种会话存储方式方式只适用于客户端代码和服务端代码运行在同一台服务器上
,token适用于项目级的前后端分离
(前后端代码运行在不同的服务器下)
20 Servlet是线程安全的吗
Servlet不是线程安全
的,多线程并发的读写会导致数据不同步的问题。
21 Servlet是线程安全的解决方法
解决的办法是尽量不要定义name属性
,而是要把name变量分别定义在doGet() 和doPost()方法内
。
虽然使用synchronized(name){}语句块可以解决问题,但是会造成线程的等待,不是很科学的办法。
注意:多线程的并发的读写Servlet类属性会导致数据不同步。但是如果只是并发地读取属性而不写入,则不存在数据不同步的问题。因此Servlet里的只读属性最好定义为final类型的
。
22 Servlet主要负责做什么
Java Web程序中,Servlet主要负责接收用户请求 HttpServletRequest,
- 在 doGet(),doPost()中做相应的处理,
- 并将回应HttpServletResponse反馈给用户。
- Servlet可以设置初始化参数,供Servlet内部使用。
23 Servlet接口中有哪些方法
Servlet接口定义了5个方法,其中前三个方法与Servlet生命周期相关:
-
void
init
(ServletConfig config) throws ServletException -
void
service
(ServletRequest req, ServletResponse resp) throws ServletException, java.io.IOException -
void
destory
() -
java.lang.String
getServletInfo
() -
ServletConfig
getServletConfig
()
24 Servlet生命周期
Web容器加载Servlet并将其实例化后,Servlet生命周期开始
,
容器运行
其init()方法
进行Servlet的初始化
;- 请求到达时
调用Servlet的service()方法
,service()方法会根据需要调用与请求对应的doGet或doPost等方法; - 当服务器关闭或项目被卸载时服务器会将Servlet实例销毁,此时
会调用Servlet 的destroy()
方法。 init方法和destory方法只会执行一次
,service方法客户端每次请求Servlet都会执行。- Servlet中有时会用到一些需要初始化与销毁的资源,因此可以把
初始化资源的代码放入init方法
中,销毁资源的代码放入destroy方法
中,这样就不需要每次处理客户端的请求都要初始化与销毁资源。
25 如果客户端禁止 cookie 能实现 session 还能用吗?
Cookie 与 Session,一般认为是两个独立的东西,Session采用的是在服务器端保持状态的方案,而Cookie采用的是在客户端保持状态的方案。
为什么禁用Cookie就不能得到Session呢?因为Session是用Session ID来确定当前对话所对应的服务器Session,而Session ID是通过Cookie来传递的,禁用Cookie相当于失去了Session ID,也就得不到Session
。
假定用户关闭Cookie的情况下使用Session,其实现途径有以下几种:
手动通过URL传值、隐藏表单传递Session ID
。用文件、数据库等形式保存Session ID
,在跨页过程中手动调用
26 分包和粘包
图例说明:
- 正常情况:如果Socket Client 发送的数据包,在Socket Server端也是一个一个完整接收的,那个就不会出现粘包和分包情况,数据正常读取。
- 粘包情况:Socket Client发送的数据包,在客户端发送和服务器接收的情况下都有可能发送,因为客户端发送的数据都是发送的一个缓冲buffer,然后由缓冲buffer最后刷到数据链路层的,那么就有可能把数据包2的一部分数据结合数据包1的全部被一起发送出去了,这样在服务器端就有可能出现这样的情况,导致读取的数据包1包含了数据包2的一部分数据,这就
产生粘包
,当然也有可能把数据包1和数据包2全部读取出来。 - 分包情况:意思就是把数据包2或者数据包1都有可能被分开一部分发送出去,接着发另外的部分,在服务器端有可能一次读取操作只读到一个完整数据包的一部分。
- 在数据包发送的情况下,有可能后面的数据包分开成2个或者多个,但是最前面的部分包,黏住在前面的一个完整或者部分包的后面,也就是
粘包和分包同时产生
了。
27 socket网络异常
connect函数返回状态及其原因
recv函数返回状态及其原因
send函数返回状态及其原因
28 http中,get post的区别
get: 从服务器上获取数据,也就是所谓的查,仅仅是获取服务器资源,不进行修改。
post: 向服务器提交数据,这就涉及到了数据的更新,也就是更改服务器的数据。
请求方式的区别:
- get
请求的数据会附加在URL之后
,特定的浏览器和服务器对URL的长度有限制
. - post
更加安全数据不会暴漏在url
上,而且长度没有限制
.
29 HTTP报文内容
29.1 简介
HTTP报文是面向文本
的,报文中的每一个字段都是一些ASCII码串
,各个字段的长度是不确定
的。
HTTP有两类报文:请求报文和响应报文
。
29.2 HTTP请求报文
一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据
4个部分组成,
请求报文的一般格式
<request-line>
<headers>
<blank line>
<request-body>
29.2.1 请求头
请求行由请求方法字段、URL字段和HTTP协议版本字段
3个字段组成,它们用空格分隔
。
例如:GET /index.html HTTP/1.1。
HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。
常用:GET、POST、HEAD
GET
最常见的一种请求方式,使用GET方式的常见场景
- 当客户端要从服务器中读取文档时,
- 当点击网页上的链接或者
- 通过在浏览器的地址栏输入网址来浏览网页的,使。
GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端
。
使用GET方法时,请求参数和对应的值附加在URL后面,
- 利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。
GET方式的请求一般不包含”请求内容”部分,请求数据以地址的形式表现在请求行
地址中”?”
之后的部分就是通过GET发送的请求数据,各个数据之间用”&”符号隔开
。
由于不同的浏览器对地址的字符限制也有所不同,一般最多只能识别1024个字符
,所以如果需要传送大量数据的时候,也不适合使用GET方式
。
POST
对于上面提到的不适合使用GET方式的情况,可以考虑使用POST方式,
因为使用POST方法可以允许客户端给服务器提供信息较多
。
POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现
,可以传输大量数据,这样POST方式对传送的数据大小没有限制,而且也不会显示在URL中
。
POST方式请求行中不包含数据字符串,这些数据保存在”请求内容”部分,各数据之间也是使用”&”符号隔
HEAD
HEAD就像GET,只不过服务端接受到HEAD请求后只返回响应头,而不会发送响应内容
。
当我们只需要查看某个页面的状态的时候,使用HEAD是非常高效的,因为在传输的过程中省去了页面内容
。
29.2.2 请求头部
请求头部由关键字/值对
组成,每行一对,关键字和值用英文冒号“:”分隔
。
请求头部通知服务器有关于客户端请求的信息,典型的请求头有:
- User-Agent:产生请求的浏览器类型。
- Accept:客户端可识别的内容类型列表。
- Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
29.2.3 空行
最后一个请求头之后是一个空行
,发送回车符和换行符,通知服务器以下不再有请求头
。
29.2.4 请求数据
请求数据不在GET方法中使用,而是在POST方法中使用
。
POST方法适用于需要客户填写表单的场合。
与请求数据相关的最常使用的请求头是
- Content-Type
- Content-Length。
29.3 HTTP响应报文
29.3.1 简介
HTTP响应也由三个部分组成
,分别是:状态行、消息报头、响应正文
。
HTTP响应的格式与请求的格式十分类似:
<status-line>
<headers>
<blank line>
[<response-body>]
在响应中唯一真正的区别在于第一行中用状态信息代替了请求信息
29.3.2 状态行
状态行(status line)通过提供一个状态码来说明所请求的资源情况。
状态行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
其中,
- HTTP-Version表示服务器HTTP协议的版本;
- Status-Code表示服务器发回的响应状态代码;
- Reason-Phrase表示状态代码的文本描述。
状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。
- 1xx:指示信息–表示
请求已接收,继续处理
。 - 2xx:成功–表示
请求已被成功接收、理解、接受
。 - 3xx:重定向–
要完成请求必须进行更进一步的操作
。 - 4xx:客户端错误–
请求有语法错误或请求无法实现
。 - 5xx:服务器端错误–
服务器未能实现合法的请求
。
常见状态代码:
- 200 OK:客户端请求成功。
- 400 Bad Request:客户端请求有语法错误,不能被服务器所理解。
- 401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
- 403 Forbidden:服务器收到请求,但是拒绝提供服务。
- 404 Not Found:请求资源不存在,举个例子:输入了错误的URL。
- 500 Internal Server Error:服务器发生不可预期的错误。
- 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常,举个例子:HTTP/1.1 200 OK(CRLF)
30 浏览器访问http://www.taobao.com,经历了怎样的过程。
首先是查找浏览器缓存
,浏览器会保存一段时间你之前访问过的一些网址的DNS信息,不同浏览器保存的时常不等。
如果没有找到对应的记录,这个时候浏览器会尝试调用系统缓存
来继续查找这个网址的对应DNS信息
。
如果还是没找到对应的IP,那么接着会发送一个请求到路由器上
,然后路由器在自己的路由器缓存上查找记录,路由器一般也存有DNS信息。
如果还是没有,这个请求就会被发送到ISP
如果还是没有的话, 你的ISP的DNS服务器会将请求发向根域名服务器进行搜索
。
- 如果到了这里还是找不到域名的对应信息,那只能说明一个问题:这个域名本来就不存在,它没有在网上正式注册过。或者卖域名的把它回收掉了(通常是因为欠费)。
这也就是为什么打开一个新页面会有点慢,因为本地没什么缓存,要这样递归地查询下去
。
发送完请求接下来就是等待回应了
- 服务器收到浏览器的请求以后(其实是WEB服务器接收到了这个请求,WEB服务器有iis、apache等),
- 它会解析这个请求(读请求头),
- 然后生成一个响应头和具体响应内容。
- 接着服务器会传回来一个响应头和一个响应,响应头告诉了浏览器一些必要的信息,例如重要的Status Code,2开头如200表示一切正常,3开头表示重定向,4开头,如404。响应就是具体的页面编码,就是那个…,
- 浏览器先读了关于这个响应的说明书(响应头),然后开始解析这个响应并在页面上显示出来。
- 如果是个静态页面,那么基本上到这一步就没了,但是如今的网站几乎没有静态的了吧,基本全是动态的。
- 所以这时候事情还没完,根据我们的经验,浏览器打开一个网址的时候会慢慢加载这个页面,一部分一部分的显示,直到完全显示,最后标签栏上的圈圈就不转了。
对于静态的页面内容,浏览器通常会进行缓存,而对于动态的内容,浏览器通常不会进行缓存。缓存的内容通常也不会保存很久,因为难保网站不会被改动。
31 Ping过程原理
有两种情况:
- 一种是
同一网段内
, - 一种是
跨网段
的ping
31.1 同一网段的ping
首先,如果主机A,要去 ping主机B,那么主机A,就要封装二层报文,他会先查自己的MAC地址表,如果没有B的MAC地址,就会向外发送一个ARP广播包
其次,交换机会收到这个报文后,交换机有学习MAC地址的功能,所以他会检索自己有没有保存主机B有MAC,如果有,就返回给主机A, 如果没有,就会向所有端口发送ARP广播 ,
其它主机收到后,发现不是在找自己,就纷纷丢弃了该报文,不去理会。直到主机B收到了报文后,就立即响应,我的MAC地址是多少,同时学到主机A的MAC地址,并按同样的ARP报文格式返回给主机A
这时候主机A学到了主机B的MAC,就把这个MAC封装到ICMP协议的二层报文中向主机B发送
当主机B收到了这个报文后,发现是主机A 的ICPM回显请求,就按同样的格式,返回一个值给主机A,这样就完成了同一网段内的ping过程
这些过程,实际过程的发生不到 1毫秒
31.2 跨网段的ping
如果主机A要ping主机C,那么主机A发现主机C的IP和自己不是同一网段,他就去找网关转发,如果他也不知道网关的MAC情况下呢?
- 他就会向之前那个步骤一样 先发送一个ARP广播,学到网关的MAC,再发封装ICMP报文给网关路由器.
当路由器收到主机A发过来的ICMP报文,发现自己的目的地址是其本身MAC地址,得到一个出口指针,去掉原来的MAC头部,加上自己的MAC地址向主机C转发
- 如果网关也没有主机C的MAC地址,还是要向前面一个步骤一样,ARP广播一下即可相互学到….路由器2端口能学到主机D的MAC,主机D也能学到路由器2端口的MAC
最后,在主机C已学到路由器2端口MAC,路由器2端口转发给路由器1端口。路由1端口学到主机A的MAC的情况下,他们就不需要再做ARP解析,就将ICMP的回显请求回复过来
32 TCP/IP协议
32.1 ARP(地址解析协议)
32.1.1 简介
对于以太网,数据链路层上是根据48bit的以太网地址来确定目的接口,设备驱动程序从不检查IP数据报中的目的IP地址。
ARP协议为IP地址到对应的硬件地址之间提供动态映射
。
ARP协议只适用于局域网
点对点链路不使用ARP协议。
32.1.2 工作过程
在以太网中,如果本地主机想要向某一个IP地址的主机发包,但是并不知道其硬件地址,此时利用ARP协议提供的机制来获取硬件地址
,
具体过程如下:
- 本地主机在局域网中广播ARP请求,ARP请求数据帧中包含目的主机的IP地址。
-
目的主机的ARP层解析这份广播报文,识别出是询问其硬件地址。于是发送ARP应答包,里面包含IP地址及其对应的硬件地址。
-
本地主机收到ARP应答后,知道了目的地址的硬件地址,之后的数据报就可以传送了。
32.2 ARP高速缓存
每个主机都有一个ARP高速缓存表,这样避免每次发包时都需要发送ARP请求来获取硬件地址
默认老化时间是20分钟
arp -a:命令可以查看显示系统中高速缓存的内容
32.3 ARP代理
如果ARP请求时从一个网络的主机发往另一个网络上的主机,那么连接这两个网络的路由器可以回答该请求,
这个过程称作委托ARP或者ARP代理。这样可以欺骗发起ARP请求的发送端,使它误以为路由器就是目的主机。
33 RARP(逆地址解析协议)
33.1 简介
将局域网中某个主机的物理地址转换为IP地址
。
RARP协议广泛应用于无盘工作站引导时获取IP地址。
RARP 允许局域网的物理机器从网管服务器ARP表或者缓存上请求其IP地址。
33.2 工作原理
- 主机发送一个本地的RARP广播,在此广播包中,声明自己的MAC地址并且请求任何收到此请求的RARP服务器分配一个IP地址。
- 本地网段上的RARP服务器收到此请求后,检查其RARP列表,查找该MAC地址对应的IP地址。
- 如果存在,RARP服务器就给源主机发送一个响应数据包并将此IP地址提供给对方主机使用。
- 如果不存在,RARP服务器对此不做任何的响应。
- 源主机收到从RARP服务器的响应信息,就利用得到的IP地址进行通讯;如果一直没有收到RARP服务器的响应信息,表示初始化失败。
33 DNS(域名系统)域名解析的过程
33.1 主机解析域名的顺序
1、找缓存
2、找本机的hosts文件
3、找DNS服务器
注:
- 配置IP和主机名时,要记得修改/etc/hosts文件,因为有些应用程序在主机内的进程之间通信的时候,会使用本机的主机名,如果主机名不能正确解析到一个正常的IP地址,那么就会导致进程通信有问题。
33.1 概念解释
DNS:域名系统
1、因特网上作为域名和IP(Internet Protocol Address)地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。
2、通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。
3、DNS协议运行在UDP协议之上,使用端口号53。
4、在整个互联网体系中,约定俗成的用于标识网络上设备的地址是IP,然而我们输入的是DNS,因为域名更方便人们记忆,不然那么多网站,人怎么可能记住所有的IP地址。
33.1 浏览器如何通过域名去查询URL对应的IP(对应服务器地址)呢?
1、浏览器缓存:浏览器会按照一定的频率缓存DNS记录。
2、操作系统缓存:如果浏览器缓存中找不到需要的DNS记录,那就去操作系统中找。
3、路由缓存:路由器也有DNS缓存。
4、ISP的DNS服务器:ISP是互联网服务提供商(Internet Service Provider)的简称,ISP有专门的DNS服务器应对DNS查询请求。
5、根服务器:ISP的DNS服务器还找不到的话,它就会向根服务器发出请求,进行递归查询(DNS服务器先问根域名服务器.com域名服务器的IP地址,然后再问.com域名服务器,依次类推)。
33.1 在网上查到某个网站的IP地址,在自己的浏览器上输入,却为什么连接不上?
大的高并发网站可能不止一个IP地址,根据不同的网络他们会有很多的IP来做集群。有的是通过DNS来实现负载均衡,有的是用squid来实现的。
34 RPC
34.1 RPC的作用
http接口是在接口不多、系统与系统交互较少的情况下,解决信息孤岛初期常使用的一种通信手段;
优点
- 简单、直接、开发方便。
- 利用现成的http协议进行传输。
但是如果是一个大型的网站,内部子系统较多、接口非常多的情况下,RPC框架的好处就显示出来了,
- 首先就是
长链接
,不必每次通信都要像http一样去3次握手什么的,减少了网络开销
; - 其次就是RPC框架一般都有注册中心,
有丰富的监控管理
; 发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作。 - 第三个来说就是安全性。
- 最后就是 近流行的服务化架构、服务化治理,RPC框架是一个强力的支撑。
34.2 什么是RPC
RPC(Remote Procedure Call Protocol)远程过程调用协议
,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。简言之,RPC使得程序能够像访问本地系统资源一样,去访问远端系统资源
。
比较关键的一些方面包括:通讯协议、序列化、资源(接口)描述、服务框架、性能、语言支持等。
RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法
(可以统称为服务)并得到返回的结果
。
34.3 PRC架构组件
一个基本的RPC架构里面应该至少包含以下4个组件:
1、 客户端(Client):服务调用方(服务消费者)
2、 客户端存根(Client Stub):存放服务端地址信息,将客户端的请求参数数据信息打包成网络消息,再通过网络传输发送给服务端
3、 服务端存根(Server Stub):接收客户端发送过来的请求消息并进行解包,然后再调用本地服务进行处理
4、 服务端(Server):服务的真正提供者
34.4 具体流程
1、 服务消费者(client客户端)通过调用本地服务的方式调用需要消费的服务;
2、 客户端存根(client stub)接收到调用请求后负责将方法、入参等信息序列化(组装)成能够进行网络传输的消息体;
3、 客户端存根(client stub)找到远程的服务地址,并且将消息通过网络发送给服务端;
4、 服务端存根(server stub)收到消息后进行解码(反序列化操作);
5、 服务端存根(server stub)根据解码结果调用本地的服务进行相关处理;
6、 本地服务执行具体业务逻辑并将处理结果返回给服务端存根(server stub);
7、 服务端存根(server stub)将返回结果重新打包成消息(序列化)并通过网络发送至消费方;
8、 客户端存根(client stub)接收到消息,并进行解码(反序列化);
9、 服务消费方得到 终结果;而RPC框架的实现目标则是将上面的第2-10步完好地封装起来,也就是把调用、编码/解码的过程给封装起来,让用户感觉上像调用本地服务一样的调用远程服务。
34.5 RPC和SOA、SOAP、REST的区别
REST
看着是HTTP协议的一种直接应用,默认基于JSON作为传输格式
,
使用简单, 学习成本低效率高,但是安全性较低。
SOAP
SOAP是一种数据交换协议规范,是一种轻量的、简单的、基于XML的协议的规范。
优点:易用、灵活、跨语言、跨平台。
SOA
面向服务架构,它可以根据需求通过网络对松散耦合的粗粒度应用组件进行分布式部署、组合和使用
。
服务层是SOA的基础,可以直接被应用调用,从而有效控制系统中与软件代理交互的人为依赖性。
SOA是一种粗粒度、松耦合服务架构,服务之间通过简单、精确定义接口进行通讯,不涉及底层编程接口和通讯模型。
SOA可以看作是B/S模型、XML(标准通用标记语言的子集)/Web Service技术之后的自然延伸。
EST 和 SOAP、RPC 区别
没什么太大区别,他们的本质都是提供可支持分布式的基础服务, 大的区别在于他们各自的的特点所带来的不同应用场景
34.6 RPC的实现基础?
1、 需要有非常高效的网络通信,比如一般选择Netty作为网络通信框架;
2、 需要有比较高效的序列化框架,比如谷歌的Protobuf序列化框架;
3、 可靠的寻址方式(主要是提供服务的发现),比如可以使用Zookeeper来注册服务等等;
4、 如果是带会话(状态)的RPC调用,还需要有会话和状态保持的功能;
34.7 RPC使用了哪些关键技术?
1、动态代理
2、序列化和反序列化
:
3、NIO通信
4、服务注册中心