1.从网络加载一个10M的图片,说下注意事项

2.OSI网络体系结构与TCP/IP协议模型
OSI:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层
TCP/IP:网络接口层,网络层,传输层,应用层

3.TCP的3次握手和四次挥手
3次握手:1.客户端向服务器发送连接请求,SYN=1,seq=x;
2.服务器回应请求,并为客户端分配缓存空间,服务器回复SYN=1,ACK=1,seq=u,ack=x+1;
3.客户端收到回应,为该TCP连接分配缓存和变量,并回复ACK=1,seq=x+1;ack=u+1;
连接建立

4次挥手:1.客户端向服务器发送断开连接请求FIN=1,seq=x;
2.服务器回复一个确认报文,客户端-服务器方向断开,ACK=1,seq=v,ack=x+1;
3.服务器也想断开连接,发送FIN=1,AK=1,seq=v,ack=x+1;
4.客户端回复一个确认报文,ACK=1,SEQ=X+1,ack=v+1,并在一个往返时延后,彻底关闭.
f服务器收到ack关闭

4.为什么TCP链接需要三次握手,两次不可以么,为什么?
因为为了确保服务器和客户端双方的接收能力和发送能力都没有问题,第三次是为了保证客户端的接收能力和服务器的发送能力
第一次握手验证发送方的发送能力没问题;
第二次握手验证接收方的接收能力没问题,接收方的发送能力;同时TCP连接属于半开状态,接收方与发送方的连接还没有建立。
第三次握手验证发送方的接收能力没问题,同时建立了接收方与发送方之间的连接

5.TCP协议如何来保证传输的可靠性
确保传输可靠性的方式:
TCP协议保证数据传输可靠性的方式主要有:
校验和:校验和 反码求和过程
序列号:
确认应答:
超时重传:基本原理是发送一个数据之后,就开启一个定时器,如果定时器超时了还没有收到消息的应答,则认为数据丢失,立即重发这一组数据。如果一直重发失败,满足一定次数后,就放弃并发送一个复位信号。
连接管理:即三次握手,四次挥手
流量控制:就是为了控制数据的发送速率不要太快。给定一个发送窗口大小和一个接收窗口大小,发送窗口的大小要小于接收窗口的大小。一旦接收方的缓存不够用了,则发送一个零窗口通知,让发送方停止发送数据。一旦接收方的缓存得到缓解,则发送非零窗口报文。如果这个报文丢失,则发送方会造成零窗口死锁。
为了缓解这个问题,为了TCP的每一个连接设定一个持续计时器,一旦收到零窗口通知,则启动这个定时器,定时的发送零窗口探测报文,如果对方确认报文时回复当前窗口大小。
拥塞控制:相对于流量控制,拥塞控制是为了缓解发送数据量过大造成的网络拥塞。缓解操作为慢开始,拥塞避免,快重传,快回复。

6.TCP与UDP的区别
UDP:无连接,无应答,不可靠数据传输,有单播、多播、广播的能力,面向报文,头部开销小,传输数据报文具有优势
TCP:有连接,有应答,可靠传输,仅支持单播传输,面向字节流(即有序),提供拥塞控制、提供全双工
图片说明

7.TCP与UDP的有哪些应用
TCP应用场景:
效率要求相对低,但对准确性要求相对高的场景。因为传输中需要对数据确认、重发、排序等操作,相比之下效率没有UDP高。举几个例子:文件传输(准确高要求高、但是速度可以相对慢)、接受邮件、远程登录。

UDP应用场景:
效率要求相对高,对准确性要求相对低的场景。举几个例子:QQ聊天、在线视频、网络语音电话(即时通讯,速度要求高,但是出现偶尔断续不是太大问题,并且此处完全不可以使用重发机制)、广播通信(广播、多播)

8.HTTP1.0与HTTP1.1和2.0的区别
HTTP1.0与HTTP1.1的区别
1.1.0是短连接,1.1是长连接,即一次连接可以进行多次传输;
2.1.0存在浪费带宽的现象,客户只是想请求资源的部分内容,而1.0只能请求资源的全部内容。1.1在头部引入了range头域,他允许只请求资源的部分内容。返回206状态码。
3.由于1.0默认,一个ip地址即一台主机,1.0在URL中没有传递主机名。由于由于科技发展,一台物理服务器上可以存在多台虚拟主机,他们共享一个ip地址,所以,1.1中的请求消息和响应消息都应该支持host头域;

HTTP1.x和2.0的区别
1.新的二进制格式(Binary Format):
HTTP1.x的解析是基于文本。(文本的表现形式有多样性,要考虑的场景很多才能做到健壮性)
基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。
2.HTTP2.0比HTTP1.0有多路复用(MultiPlexing):
即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。
3.header压缩:
HTTP1.x的header带有大量信息,而且每次都要重复发送,
HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。
4.服务端推送(server push):
HTTP2.0也具有server push功能。每次服务器都将客户端请求的资源都伴随着index.html发送回来,避免了客户发端的重复请求,提升了效率。
附注
HTTP2.0的多路复用和HTTP1.X中的长连接复用有什么区别?
HTTP/1.* 一次请求-响应,建立一个连接,用完关闭;每一个请求都要建立一个连接;
HTTP/1.1 Pipeling解决方式为,若干个请求排队串行化单线程处理,后面的请求等待前面请求的返回才能获得执行机会,一旦有某请求超时等,后续请求只能被阻塞,毫无办法,也就是人们常说的线头阻塞;
HTTP/2多个请求可同时在一个连接上并行执行。某个请求任务耗时严重,不会影响到其它连接的正常执行;

//
1.1.是解析文本,要考虑的场景很多,要保证健壮性很难;2.0解析字节流,这样更方便且健壮;
2.1.0是每传输一次数据建立一次连接,1.1是采用排队堵塞机制,即单线程工作机制;2.0是多路复用,是指每个请求标明自己的id,服务器根据请求id进行回复;
3.1.
的头部需要携带很多信息所以非常大,每次建立连接都要重新发送,增大了开销;2.0使用encode压缩了头部,给头部建立了字典,每次差量更新,这样不需要每次都重新发送头部,减小了网络开销;
4.增***务器推送,即服务器将客户端所要的资源index.html发送回来,避免了呢客户端的多次请求。

9.HTTP报文结构
HTTP首部字段通常有4种类型:通用首部,请求首部,响应首部,实体首部。
通用首部字段:请求报文和响应报文两方都会使用的首部。
请求首部字段:从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、响应内容相关优先级等信息。
响应首部字段:从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息。
实体首部字段:针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等和实体有关的信息。
(1)HTTP请求报文
一个HTTP请求报文由请求行(request line)、请求头部(request header)、空行和请求数据4个部分构成。
图片说明
请求行数据格式由三个部分组成:请求方法、URI、HTTP协议版本,他们之间用空格分隔。
该部分的请求方法字段给出了请求类型,URI给出请求的资源位置(/index.html)。HTTP中的请求类型包括:GET、POST、HEAD、PUT、DELETE。一般常用的为GET和POST方式。最后HTTP协议版本给出HTTP的版本号。
GET和POST的区别:
(1)get是从服务器上获取数据,post是向服务器传送数据。
(2)生成方式不同:
Get:URL输入;超连接;Form表单中method属性为get;Form表单中method为空。
Post只有一种:Form表单中method为Post。
(3)数据传送方式:Get传递的请求数据按照key-value的方式放在URL后面,在网址中可以直接看到,使用?分割URL和传输数据,传输的参数之间以&相连,如:login.action?name=user&password=123。所以安全性差。
POST方***把请求的参数放到请求头部和空格下面的请求数据字段就是请求正文(请求体)中以&分隔各个字段,请求行不包含参数,URL中不会额外附带参数。所以安全性高。
(3)发送数据大小的限制:通常GET请求可以用于获取轻量级的数据,而POST请求的内容数据量比较庞大些。
Get:1~2KB。get方法提交数据的大小直接影响到了URL的长度,但HTTP协议规范中其实是没有对URL限制长度的,限制URL长度的是客户端或服务器的支持的不同所影响。
Post:没有要求。post方式HTTP协议规范中也没有限定,起限制作用的是服务器的处理程序的能力。
(4)提交数据的安全:POST比GET方式的安全性要高。Get安全性差,Post安全性高。
通过GET提交数据,用户名和密码将明文出现在URL上,如果登录页面有浏览器缓存,或者其他人查看浏览器的历史记录,那么
就可以拿到用户的账号和密码了。安全性将会很差。
其中HTTP协议版本有两种:HTTP1.0/HTTP1.1。HTTP1.0/HTTP1.1的区别:
HTTP1.0对于每个连接都只能传送一个请求和响应,请求完服务器返回响应就会关闭,HTTP1.0没有Host字段。
而HTTP1.1在同一个连接中可以传送多个请求和响应,多个请求可以重叠和同时进行,HTTP1.1必须有Host字段。
请求头部紧跟着请求行,该部分主要是用于描述请求正文,
主要是用于说明请求源、连接类型、以及一些Cookie信息等。
请求正文和请求头部通过一个空行进行隔开,一般用于存放POST请求类型的请求正文
(2)HTTP响应报文
HTTP响应报文由状态行(HTTP版本、状态码(数字和原因短语))、响应头部、空行和响应体4个部分构成。
图片说明
状态行主要给出响应HTTP协议的版本号、响应返回状态码、响应描述,同样是单行显示。格式为:
HTTP/1.1 200 OK
状态码告知从服务器端返回的请求的状态,一般由一个三位数组成,分别以整数1~5开头组成。各个响应的类型对应的含义:
1XX 请求正在处理:
2XX 请求成功: 200 OK 正常处理 204 no content 请求处理成功但没有资源可返回 206 Partial Content 对资源的某一部分请求
3XX 重定向: 301 Moved Permanenly请求资源的URI已经更新(永久移动),客户端会同步更新URI。
302 Found 资源的URI已临时定位到其他位置,客户端不会更新URI。
303 See Other 资源的URI已更新,明确表示客户端要使用GET方法获取资源。
304 Not Modified 当客户端附带条件请求访问资源时资源已找到但未符合条件请求。
307 Temporary Redirect临时重定向
4XX 客户端错误: 400 Bad Request 请求报文中存在语法错误,一般为参数异常。401 Unauthorized 发送的请求需要HTTP认证。
403 Forbiddden 不允许访问,对请求资源的访问被服务器拒绝 404 Not Found 无法找到请求的资源,请求资源不存在。
405 请求的方式不支持。
5XX 服务器错误: 500 Internal Server Error 服务器的内部资源出故障,服务器在执行请求时发生了错误。
503 Service Unavailable 服务器暂时处于超负载状态或正在进行停机维护,无法处理请求,服务器正忙。
响应头部主要是返回一些服务器的基本信息,以及一些Cookie值等
响应体为请求需要得到的具体数据,可以为任何类型数据,一般网页浏览返回的为html文件内容,

//
1XX:请求正在处理
2XX:请求成功(200:请求成功 204:请求成功但是没有资源返回 206:请求成功部分资源返回)
3XX:请求重定向(301:moved permanenlly请求的URI已经永久的改变,客户端记录下这个URI 302:found资源已经定位到了其他的位置,客户端不会更新URI 303:see other:资源URI已更新,并明确用get传输 304:not modified 请求的资源已经找到,但是没有符合条件请求 307:temporary redirect临时重定向)
4XX:客户端错误(400:bad request请求报文中存在于法错误,一般为参数错误
401:unauthorized需要http的验证 403:forbidden对请求资源服务器拒绝访问 404:not found无法找到请求的资源,请求的资源不存在 405请求的方式不支持)
5XX:服务器错误(500:internal server error服务器内部出错,在处理请求资源时出了故障 503:service unavailable服务器正忙 )

10.HTTP的长连接和短连接?
长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。对于频繁请求资源的客户端适合使用长连接。在长连接的应用场景下,client端一般不会主动关闭连接,当client与server之间的连接一直不关闭,随着客户端连接越来越多,server会保持过多连接。这时候server端需要采取一些策略,如关闭一些长时间没有请求发生的连接,这样可以避免一些恶意连接导致server端服务受损;如果条件允许则可以限制每个客户端的最大长连接数,这样可以完全避免恶意的客户端拖垮整体后端服务。
短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。但如果客户请求频繁,将在TCP的建立和关闭操作上浪费较多时间和带宽。
长连接和短连接的产生在于client和server采取的关闭策略。不同的应用场景适合采用不同的策略。
由上可以看出,长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。对于频繁请求资源的客户来说,较适用长连接。不过这里存在一个问题,存活功能的探测周期太长,还有就是它只是探测TCP连接的存活,属于比较斯文的做法,遇到恶意的连接时,保活功能就不够使了。在长连接的应用场景下,client端一般不会主动关闭它们之间的连接,Client与server之间的连接如果一直不关闭的话,会存在一个问题,随着客户端连接越来越多,server早晚有扛不住的时候,这时候server端需要采取一些策略,如关闭一些长时间没有读写事件发生的连接,这样可 以避免一些恶意连接导致server端服务受损;如果条件再允许就可以以客户端机器为颗粒度,限制每个客户端的最大长连接数,这样可以完全避免某个蛋疼的客户端连累后端服务。
短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。但如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽。
长连接和短连接的产生在于client和server采取的关闭策略,具体的应用场景采用具体的策略,没有十全十美的选择,只有合适的选择。

长连接短连接操作过程
短连接的操作步骤是:
建立连接——数据传输——关闭连接...建立连接——数据传输——关闭连接
长连接的操作步骤是:
建立连接——数据传输...(保持连接)...数据传输——关闭连接
什么时候用长连接,短连接?   
长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况,。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。

  而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。
//
1.短连接是每一次传输都建立一个连接,而长连接在响应头部写connection:keep alive,是一次连接建立后,不会立即关闭。如果每两个小时连接不用,则服务器会向客户端发送探测报文,如果收到回复,则重置保活时间;
2.如果长连接在没断开的时候,客户端遭遇失联,则服务器发送探测报文,每隔25s,连续发送10个,如果得不到回复,则断开连接。
3.如果客户端重启后,向服务器发送探测报文,意在断开连接;
4.如果服务器出问题,处理类似2。
长连接适用于需要频繁传输数据的双方,因为每次建立连接都需要时间成本和开销;如果长连接建立的越来越多,则关闭一些不常使用的连接。
//

11.HTTP与HTTPS的区别以及如何实现安全性
HTTP与HTTPS有什么区别?
  HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。
  HTTPS和HTTP的区别主要如下:
  1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
  2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
  3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
  4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
图片说明
//
1.需要申请CA证书,通常CA证书不是免费的
2.非铭文传输,采用对称加密或者非对称加密;
3.采用数字证书和数字签名结合,保障数据传输的安全性;
4.http的端口号是80,https采用的是443

具体阐述https
1.对称加密:服务器将自己的公钥发送给各个客户端,客户端用服务器给的公钥进行加密后将数据传输给服务器;
2.非对称加密:
公钥加密:服务器自己有私钥,将自己的公钥发出去,传输过来的消息用自己私钥解密,防止数据劫持;
私钥加密:同时,如果冒充客户端给服务器发数据,这时客户端把自己的公钥发出去,用自己的私钥加密邮件,如果服务器用客户端的公钥能解密,则证明邮件来自客户端;
4.数字证书和数字签名:
数字签名:A给B发送消息,A先对数据执行哈希算法,得到一个类似摘要,然后用自己的私钥对这个摘要加密,最后放在数据的正文后面发过去,如果B能用A的公钥解密,则证明数据来自A,然后用哈希运算,得到的数据与正文数据进行比对,如果一直,则数据没有被篡改;
数字证书:首先A去找"证书中心"(certificate authority,简称CA),为公钥做认证。证书中心用自己的私钥,对A的公钥和一些相关信息一起加密,生成"数字证书"(Digital Certificate),A在邮件正文下方除了数字签名,另外加上这张数字证书,B收到Email后用CA的公钥解密这份数字证书,拿到A的公钥,然后验证数字签名,后面流程就和图1的流程一样了,不再赘述。

https的加密流程:

  1. 服务器把自己的公开密钥登录至数字证书认证机构。
  2. 数字证书认证机构用自己的私有密钥向服务器的公开密码进行单向hash编码,形成摘要,作为数字签名,并颁发公钥证书。
  3. 客户端拿到服务器的公钥证书后,使用数字签名认证机构的公开密钥,向数字证书认证机构验证公钥证书上的数字签名,以确认服务器的公开密钥的真实性。
  4. 客户端使用服务器的公开密钥对自己的对称密钥加密后发送。
  5. 服务器用私有密钥对客户端的对称密钥解密。
  6. 之后使用客户端的对称密钥进行数据传输。
    原因:
  7. 为什么要使用CA证书加密服务器的公钥?
    答:为了确保该信息缺失来自服务器,而不是劫持方。
  8. 为什么要使用服务器的非对称加密?
    答:防止客户端返回的消息被劫持,用公钥解密。
  9. 为什么使用客户端的对称密钥传输数据?
    答:非对称加密的开销较为大,时间也比较慢,使用对称加密更为划算。

12.如何验证证书的合法性

13.Get与POST的区别
最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。
GET在浏览器回退时是无害的,而POST会再次提交请求。
GET产生的URL地址可以被Bookmark,而POST不可以。
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
GET请求只能进行url编码,而POST支持多种编码方式。
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
GET请求在URL中传送的参数是有长度限制的,而POST么有。
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
GET参数通过URL传递,POST放在Request body中。
GET和POST还有一个重大区别,简单的说:
GET产生一个TCP数据包;POST产生两个TCP数据包。
长的说:
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
因为POST需要两步,时间上消耗的要多一点,看起来GET比POST更有效。因此Yahoo团队有推荐用GET替换POST来优化网站性能。但这是一个坑!跳入需谨慎。为什么?

  1. GET与POST都有自己的语义,不能随便混用。
  2. 据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。
  3. 并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。

//
1.get的信息都放在head,而post放在body,因此get携带的数据量大小有限制
2.get传输是一次性将head和数据发送过去,而post是要分两次,即第一次先发送head,页面显示100,,请求继续,然后发送数据,页面显示200;
3.get只能进行URL编码,而post支持多种形式编码;
4.get只支持ASCII码,而post没有限制;;
5.get因为直接将参数存放在head,所以很容易暴露,造成信息不安全,post相对安全;
6.get通常用来请求资源,而post用来数据传输,post传输的数据通常会对服务器产生影响。
7.get的URL地址可以被bookmark,而post不可以;
8.get的请求可以被浏览器主动cache,而post不可以;
9.get请求的参数会被完整的保留在浏览器的历史记录里,而post不可以;
10.get回退时是无害的,而post会再次提交请求。
//

14.TCP的拥塞处理
慢开始,拥塞避免,快重传,快恢复
开始的时候数据量指数增长,到了拥塞窗口,开始线性增长,等遇到了拥塞,则数据量降为当前拥塞值的一半,然后开始线性增长。如果发生了丢包,不需要等到计时器结束,只要收到三个ack,则立即重传丢失数据,并将当前拥塞窗口降为当前数据量的一半。
图片说明
慢开始:即传输刚开始时,探测一下当前的网络情况,如果每一组都收到了确认应答,则认为当前网络情况良好,慢慢的增大拥塞窗口的大小,即增大发送窗口的大小。

拥塞避免:为了防止发送窗口增长过快,所以设定了慢开始门限,从慢开始门限开始,发送窗口大小开始线性增长,比开始的指数增长要慢一些。如果遇到了拥塞,则将当前的慢开始门限降为当前拥塞值的一半,然后开始从零开始慢开始增大发送窗口大小。

快重传:根据TCP传输可靠性原理,一旦接收方收到失序的数据,例如收到M1,M2,没有收到M3,直接收到了M4,则不会等到接收方自己发送数据时携带确认信息,而是重复确认M2,一旦发送方收到三个连续的ACK确认,则不会等到重传计时器结束,立即开始数据重传。

快恢复:一旦收到三个确认过后,不执行慢开始算法,而是将当前慢开始门限降为当前拥塞值的一半,直接从慢开始门限开始,执行拥塞避免算法。

15.TCP是如何进行流量控制
流量控制:数据的传送与接收过程当中很可能出现收方来不及接收的情况,这时就需要对发方进行控制,以免数据丢失。流量控制用于防止在端口阻塞的情况下丢帧,这种方法是当发送或接收缓冲区开始溢出时通过将阻塞信号发送回源地址实现的。流量控制可以有效的防止由于网络中瞬间的大量数据对网络带来的冲击,保证用户网络高效而稳定的运行。

1.通信双方主机上都分别有一个“发送窗口”和一个“接受窗口”
2.TCP连接阶段,双方协商窗口尺寸
3.发送方根据协商的结果,发送符合窗口尺寸的数据字节流,并等待对方的确认,等待确认机制
4.发送方根据确认信息,改变窗口的尺寸

//通信双方主机上都有发送窗口和接收窗口
TCP连接阶段,双方连接协商窗口尺寸
发送方根据协商的结果,发送符合窗口尺寸的数据字节流,并等待对方的确认机制
发送方根据确认机制的返回消息更改发送窗口的大小

16.TCP和UDP分别对应的常见应用层协议
图片说明

17.IP地址的分类
图片说明
图片说明

18.有了唯一的Mac地址为啥还需要IP地址?
首先,每一台通信主机一定要有一个标识符用来唯一标识这台设备(下面把“标识符”称为“地址”)。那么每一个中间设备,一定要有一个转发表,用于查找数据该转发给哪一台设备。虽然设备的“地址”是全球唯一,但是你并不知道它所在的具***置,那么转发表里找不到目的主机“地址”的转发表项时(这个表一定不可能包含全球所有“地址”的转发表项:因为占存储、搜索慢),就只-能泛洪查找这台主机的位置,不仅导致占用大量网络带宽资源,甚至会出现二层中常见的环路等问题,最终整个互联网都会瘫痪。
那么怎么解决转发问题呢?在每一台设备拥有一个全球唯一的标识符(MAC地址)的情况下,将整个互联网划分为若干个网络,给用于连接这些网络的每一台主机分配一个全球唯一的标识符(IP地址),标识符(IP地址)前几位用于锁定目的主机所在网络,后几位用于确定目的主机是网络中具体的哪一台设备,也就是伟大的IP编址技术。而由于IP地址的个数有限,所以有私网地址的概念以及NAT技术。正因为不同网络的不同主机可以使用相同的私网IP地址,所以IP地址无法唯一标识一台设备,这个时候就得靠MAC地址啦。
总结一下:IP&MAC地址相辅相成,IP地址用于解决路由转发问题,MAC地址用于唯一标识一台设备。

19.交换机、集线器与路由器有什么区别?
集线器:工作在物理层,将各个网口做到了一起,组成一个小型局域网,一条消息进来,所有口转发。(集线器起到了一个将网线集结起来的作用,实现最初级的网络互通。集线器是通过网线直接传送数据的,我们说他工作在物理层。)
交换机:工作在数据链路层,适合局域网互联,给每个网口给上了编号,消息进来指定网口号,从指定网口转发
路由器:用一套路由协议实现多网段之间的通信,工作在网络层,用来分组转发,路由器仅仅转发特定地址的数据包,不传送不支持路由协议的数据包传送和未知目标网络数据包的传送,从而可以防止广播风暴。

20.网桥的作用
网桥的作用
  1.网桥在数据链路层上实现局域网互连;
  2.网桥能够互连两个采用不同数据链路层协议、不同传输介质与不同传输速率的网络;
  3.网桥以接收、存储、地址过滤与转发的方式实现互连的网络之间的通信;
  4.网桥需要互连的网络在数据链路层以上采用相同的协议;
  5.网桥可以分隔两个网络之间的广播通信量,有利于改善互连网络的性能与安全性。
  看了的介绍,可能大家还是觉得很陌生。其实网桥就像一个中继器,可以将两个相似的网络连接起来,就像我们生活中的桥,有了它,才能建立两个网络之间的通信及数据传输。

21.ARP是地址解析协议,简单语言解释一下工作原理。
将ip地址转换为物理地址,
1:首先,每个主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP地址和MAC地址之间的对应关系。
2:当源主机要发送数据时,首先检查ARP列表中是否有对应IP地址的目的主机的MAC地址,如果有,则直接发送数据,如果没有,就向本网段的所有主机发送ARP数据包,该数据包包括的内容有:源主机 IP地址,源主机MAC地址,目的主机的IP 地址。
3:当本网络的所有主机收到该ARP数据包时,首先检查数据包中的IP地址是否是自己的IP地址,如果不是,则忽略该数据包,如果是,则首先从数据包中取出源主机的IP和MAC地址写入到ARP列表中,如果已经存在,则覆盖,然后将自己的MAC地址写入ARP响应包中,告诉源主机自己是它想要找的MAC地址。
4:源主机收到ARP响应包后。将目的主机的IP和MAC地址写入ARP列表,并利用此信息发送数据。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。
广播发送ARP请求,单播发送ARP响应。

//1.每个主机都会在自己的ARP的缓冲区建立一个ARP列表,表示IP地址和MAC地址之间的映射
2.当源主机要发送消息时,先检查自己的ARP列表里面有没有目的主机的信息,如果没有,则向本网段的所有主机发送ARP数据包,该数据包包括:源主机的IP地址,源主机的MAC地址,目的主机的IP地址,收到数据包的主机查看自身的IP地址是不是目的主机的IP地址,如果是,则将源主机的地址信息更新到自己ARP并将自己的物理地址进行回复,如果不是就忽略;
3.源主机收到回复后,将自己的ARP列表更新。
//

22.网络接口卡(网卡)的功能?
1、进行串行/并行转换
2、对数据进行缓存
3、在计算机的操作系统安装设备驱动程序
4、实现以太网协议

23.IO中同步与异步,阻塞与非阻塞区别
同步和异步关注的是消息通信机制 (synchronous communication/asynchronous communication)
同步请求,A调用B,B的处理是同步的,在处理完之前他不会通知A,只有处理完之后才会明确的通知A。
异步请求,A调用B,B的处理是异步的,B在接到请求后先告诉A我已经接到请求了,然后异步去处理,处理完之后通过回调等方式再通知A。
同步和异步最大的区别就是被调用方的执行方式和返回时机。同步指的是被调用方做完事情之后再返回,异步指的是被调用方先返回,然后再做事情,做完之后再想办法通知调用方。
阻塞请求,A调用B,A一直等着B的返回,别的事情什么也不干。
非阻塞请求,A调用B,A不用一直等着B的返回,先去忙别的事情了。
阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。
非阻塞:不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。
阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.
同步是个过程,阻塞是线程的一种状态。
同步、异步说的是被调用者会不会通知,阻塞、非阻塞说的是调用者会不会卡住不动。

Java中的三种IO模型
在Java语言中,一共提供了三种IO模型,分别是阻塞IO(BIO)、非阻塞IO(NIO)、异步IO(AIO)。
这里面的BIO和NIO都是同步的IO模型,即同步阻塞IO和同步非阻塞IO,异步IO指的是异步非阻塞IO。
BIO (Blocking I/O):同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。
NIO (New I/O):同时支持阻塞与非阻塞模式,但主要是使用同步非阻塞IO。
AIO (Asynchronous I/O):异步非阻塞I/O模型。

24.URI和URL的区别
通过上面的描述,可以发现,URI(通用资源标志符)强调的是给资源标记命名,URL强调的是给资源定位,但是你会发现,URL(全球资源定位符)显然比URI包含信息更多,我通过URL也可以知道张三是总经理,并且我还知道了他的地址,所以大多数情况下大家觉得给一个网络资源分别命名和给出地址太麻烦,干脆就用地址既当地址用,又当标记名用,所以,URL也充当了WWW万维网里面URI的角色,但是他比URI多了一层意义,我不光知道你叫什么,我还知道你在哪里。我们在浏览器输入的都是URL,因为我们输入的目的是为了找到某一个资源,当然你输入的是URI也是没错的,因为URL也是URI。
总结:URI标记了一个网络资源,仅此而已; URL标记了一个WWW互联网资源(用地址标记),并给出了他的访问地址。
https://blog.csdn.net/wnx_52055/article/details/82178072

25.GET请求中文URL编码的意义

26.常见状态码及原因短语
HTTP请求结构: 请求方式 + 请求URI + 协议及其版本
HTTP响应结构: 状态码 + 原因短语 + 协议及其版本

1×× : 请求处理中,请求已被接受,正在处理
2××:请求成功,请求被成功处理
200 OK
3×× :重定向,要完成请求必须进行进一步处理
301 :永久性转移(资源已经永久性转移,客户端记录下URI)
302 :暂时性转移(资源暂时性转移)
304 :已缓存()
4×× :客户端错误,请求不合法
400:Bad Request,请求有语法问题
403:拒绝请求(请求的资源服务器不允许访问)
404:客户端所访问的页面不存在(请求的资源服务器不存在,无法返回)
5×× :服务器端错误,服务器不能处理合法请求
500 :服务器内部错误
503 :服务不可用,稍等

27.说说Session、Cookie 与 Application
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。
如果说 Cookie 机制是通过检查客户身上的“通行证”来确定客户身份的话,那么 Session 机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session 相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。

之上几者的主要区别就在于它们的总用范围不同和生命周期的不同。
一、session 12
为什么要用到Session对象?
因为现在使用的协议是http协议,http超文本传输协议,这些协议有一个很大的缺点:浏览器端往服务端发送一个请求的时候,会和服务建立连接,当服务接受请求,并处理返回响应信息后,会与浏览器端断开连接,当下一次在往服务器发送请求的时候,服务器端就无法判断是哪一个用户发送的请求。在这种情况下就开始使用Session对象来存储用户的信息。当用户第一次往服务器发送请求,服务器会创建一个Session对象,并给该Session对象分配一个唯一的ID号,服务器会将该ID存储一份到服务器端,将另外一份作为响应的数据发送给浏览器端,浏览器将ID存入到浏览器的进程中。每下一次发送请求的时候,会将ID一起发给服务器,服务器根据ID来判断是哪一个用户发送的请求。
二、cookie
具体来说cookie机制采用的是在客户端保持状态的方案。它是在用户端的会话状态的存贮机制,他需要用户打开客户端的cookie支持。cookie的作用就是为了解决HTTP协议无状态的缺陷所作的努力.
三、application
application的范围在服务器一开始执行服务,到服务器关闭为止。它的范围最大,生存周期最长.是在服务器启动的时候,就已经存在该对象了。该对象一般用来存储全局的信息,必须网站访问量,登录人数,每日的浏览量
图片说明
https://www.cnblogs.com/breezeblew/archive/2008/05/02/1179143.html
//
cookie和session都是会话跟踪技术,cookie是保存在客户端的,客户端给服务器发送请求,服务器回返回一个cookie,客户端下次请求时会将自己的cookie一起发送过去,服务器就会知道客户端的状态;session则是保存在服务器端,新的客户端发起请求,服务器就新建一个新的session对象,并为该对象分配一个唯一的ID,将其保存到session里面。
session是有时间限制的,一般是20分钟,而cookie是可以按需要,自定义时间限制。
//

28.如何避免浏览器缓存
Cache-Control/Pragma这个HTTP Head字段用于指定所有缓存机制在整个请求/响应链中必须服从的指令,如果知道该页面是否为缓存,不仅可以控制浏览器,还可以控制和HTTP协议相关的缓存或代理服务器。
Cache-Control请求字段被各个浏览器支持得较好,而且它的优先级也比较高,它和其他一些请求字段(如Expires)同时出现时,Cache-Control会覆盖其他字段。Pragma字段的作用和Cache-Control有点类似,它也是在HTTP头中包含一个特殊的指令,使相关的服务器来遵守,最常用的就是Pragma:no-cache,它和Cache-Control:no-cache的作用是一样的。
1.Cache-Control:no-cache
2.POST请求无法被缓存
3.HTTP响应头中不包含Last-Modified/Etag,也不包含Cache-Control/Expires的请求无法被缓存

29.什么是分块传送。
我们都知道http协议是由TCP协议封装而来的应用层协议。我们和服务器之间的每次http交互都要进行三次握手和四次挥手。那么,服务器端怎么判断客户端传来的数据已经发送完了,然后断开这次tcp连接呢?我们客户端在发送给服务器端报文中有一个Connection字段,一般这个值为close。也就是说这次数据传输完成了,服务器就会断开这次tcp连接。但是,当我们要传送的数据量比较大时,一次传输不能传输完成时,该如何办呢?这就要用到数据的分块传输了。

当使用分块传输时,请求头中的 Connection字段的值为:keep-alive ,最后一个数据包的Connection字段值为:close。

当服务器端收到Connection值为keep-alive的数据包时,会先将它存储在一个缓冲区中,当收到Connection值为close的数据包时,即表明这次数据传输完成!

通常,Content-Length消息头字段表示数据的长度。数据的长度很重要,因为服务器端需要知道哪里是应答消息的结束,以及后续应答消息的开始。然而,使用分块传输编码,数据分解成一系列数据块,并以一个或多个块发送,这样可以发送数据而不需要预先知道发送内容的总大小。通常数据块的大小是一致的,但也不总是这种情况。于是我们分块进行传输数据的每一次请求的Content-Length是我们这次请求的大小,当服务器端收到 Connection值为close的请求消息后,就会把之前的Content-Length加起来,即是我们请求的数据的总大小了。

//
分块传输:当数据量非常大时,不能一下子完全传输完,所以当客户端给服务器发送消息时,会有一个Connection字段,一般状态下,该字段是close,即本段结束之后数据传输完成,服务器就会断开TCP连接。运动分块传输时,Connection自字段会设置为keep alive,服务器收到这个字段的数据包时,会将它存在一个缓冲区,当收到Connection字段为close的数据包时,即表明这次数据传输完成。通常content-length消息头字段表示数据的长度。数据的长度很重要,服务器会根据该字段判断哪里是消息的开始和结束。但是,使用分块编码后,不需要预先知道数据包的大小。通常数据块的大小是一致的,但也不总是这种情况。分块传输每次的content-length是每次分块请求的大小,当服务器收到close后,将之前的长度相加,即得到这个数据包的完整大小。

30.谈谈SQL 注入
在用户可控制的参数上过滤不严或没有任何限制,使得用户将传入的参数(如URL,表单,http header)与SQL语句合并构成一条
  SQL语句传递给web服务器,最终传递给数据库执行增删改查等操作,并基于此获取数据库数据或提权进行破坏。
SQL Injection:
   程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患,用户可以提交一段数据库查询代码,
   根据程序返回的结果,获得某些他想得知的数据或进行数据库操作
获取数据库的数据内容或者提权获取数据库权限,有可能也会使web服务器受到威胁
根据URL中传参的参数类型分为 ①字符型 ②数字型

31.DDos 攻击
那 DDoS 攻击究竟是什么?
上面这个例子讲的就是典型的 DDoS 攻击,全称是 Distributed Denial of Service,翻译成中文就是分布式拒绝服务。一般来说是指攻击者利用“肉鸡”对目标网站在较短的时间内发起大量请求,大规模消耗目标网站的主机资源,让它无法正常服务。在线游戏、互联网金融等领域是 DDoS 攻击的高发行业。
不同于其他恶意篡改数据或劫持类攻击,DDoS简单粗暴,可以达到直接摧毁目标的目的。另外,相对其他攻击手段DDoS的技术要求和发动攻击的成本很低,只需要购买部分服务器权限或控制一批肉鸡即可,而且攻击相应速度很快,攻击效果可视。另一方面,DDoS具有攻击易防守难的特征,服务提供商为了保证正常客户的需求需要耗费大量的资源才能和攻击发起方进行对抗。这些特点使得DDoS成为黑客们手中的一把很好使的利剑,而且所向霹雳。

//
DDOS(distributed denial of service)分布式拒绝服务
指的是利用肉鸡对目标服务器短时间内发出大量请求,大规模消耗了目标网站的主机资源,让他无法正常服务。让他无法正常服务。通常高发于在线游戏和互联网金融领域。

32.DDos攻击有那些预防方法?
如何应对 DDoS 攻击?
高防服务器
还是拿我开的重庆火锅店举例,高防服务器就是我给重庆火锅店增加了两名保安,这两名保安可以让保护店铺不受流氓骚扰,并且还会定期在店铺周围巡逻防止流氓骚扰。高防服务器主要是指能独立硬防御 50Gbps 以上的服务器,能够帮助网站拒绝服务攻击,定期扫描网络主节点等,这东西是不错,就是贵
~黑名单
面对火锅店里面的流氓,我一怒之下将他们拍照入档,并禁止他们踏入店铺,但是有的时候遇到长得像的人也会禁止他进入店铺。这个就是设置黑名单,此方法秉承的就是“错杀一千,也不放一百”的原则,会封锁正常流量,影响到正常业务。
DDoS 清洗
DDos 清洗,就是我发现客人进店几分钟以后,但是一直不点餐,我就把他踢出店里。DDoS 清洗会对用户请求数据进行实时监控,及时发现DOS攻击等异常流量,在不影响正常业务开展的情况下清洗掉这些异常流量。
CDN 加速
CDN 加速,我们可以这么理解:为了减少流氓骚扰,我干脆将火锅店开到了线上,承接外卖服务,这样流氓找不到店在哪里,也耍不来流氓了。在现实中,CDN 服务将网站访问流量分配到了各个节点中,这样一方面隐藏网站的真实 IP,另一方面即使遭遇 DDoS 攻击,也可以将流量分散到各个节点中,防止源站崩溃。
又拍云安全防护
是针对容易遭受大流量 DDoS 攻击的电商、金融、游戏等类型的客户专门推出的付费增值服务。DDoS 高防节点拥有强大的流量攻击防护能力,并且支持 TCP/UDP 等多种协议,可防护 SYN Flood,ACK Flood 等多种类型的攻击。用户接入服务后,防护平台会识别并将攻击流量引流至高防节点,确保用户业务的可持续使用。

//
高防服务器:即能够抵御50Gbps以上的服务器,能够帮网站拒绝服务攻击;
黑名单:对于来过的流氓,记录到黑名单,下次来比对黑名单拒绝访问;
DDOS清洗:指客户端连接后,几分钟后不传送数据,则把该服务端连接断开;
CDN加速:将服务器的IP地址隐藏

33.什么是XSS 攻击
XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。
它指是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入Web里面的html代码会被执行,从而达到恶意用户的特殊目的。
XSS属于被动式的攻击,因为其被动且不好利用,所以许多人常呼略其危害性。但是利用XSS得到目标服务器的shell。技术虽然是老技术,可其思路希望对大家还是有帮助。

如何寻找XSS漏洞
一般XSS攻击分成两类:
一类是来自内部的攻击,主要指的是利用程序自身的漏洞,构造跨站语句,如:dvbbs的showerror.asp存在的跨站漏洞。
另一类则是来来自外部的攻击,主要指的自己构造XSS跨站漏洞网页或者寻找非目标机以外的有跨站漏洞的网页。如当我们要渗透一个站点,我们自己构造一个有跨站漏洞的网页,然后构造跨站语句,通过结合其它技术,如社会工程学等,欺骗目标服务器的管理员打开。
  然后利用下面的技术得到一个shell.

34.从输入网址到获得页面的过程
https://www.cnblogs.com/51benpao/p/12984951.html
(1)域名解析,其实就是根据用户输入的网址去寻找它对应的IP地址,比如输入www.baidu.com的网址就会经历以下过程
1.先从浏览器缓存里找IP,因为浏览器会缓存DNS记录一段时间
2.如没找到,再从Hosts文件查找是否有该域名和对应IP
3.如没找到,再从路由器缓存找
4.如没好到,再从DNS缓存查找
5.如果都没找到,浏览器域名服务器向根域名服务器(baidu.com)查找域名对应IP,还没找到就把请求转发到下一级,直到找到IP。
(2)建立TCP连接 (这里使用五层协议更详细的描述如何建立这个TCP链接的)
先是客户端发起请求过程:

  1. 使用应用层发起HTTP请求(这个可以根据你本身输入的url访问时,用的什么协议就发起对应协议去进行请求)
  2. 然后是传输层的TCP协议为传输报文提供可靠的字节流服务,这里也就使用了TCP三次握手
  3. 网络层是把TCP分割好的各种数据包传送给接收方。而要保证确实能传到接收方还需要接收方的MAC地址,也就是物理地址
  4. 然后才是链路层将数据发送到数据链路层传输。至此请求报文已发出,客户端发送请求的阶段结束
    然后是服务端接受请求处理阶段:
    原路进行处理:链路层—>网络层—>传输层—>应用层然后响应客户端发送报文。
    (3)根据SpringMVC后台业务返回数据,并把数据填充到HTML页面上,然后返回给浏览器
    这里用到的TCP三次握手的图:
    这里是根据IP地址去映射对应的MAC地址:
    图片说明
    (4)浏览器进行处理
    服务器通过后台语言程序处理,找到数据返回给浏览器,HTML字符串被浏览器接受后被一句句读取解析,解析到link标签后重新发送请求获取css,解析到sript标签后发送请求获取js,并执行代码
    (5)绘制网页
    然后浏览器会进行渲染,浏览器根据HTML和CSS计算得到渲染树,绘制到屏幕上,js会被执行

//打开网页过程
1.域名解析:先查浏览器缓存,如果没有就去查HOST文件,如果没有则查路由器缓存,如果没有则查DNS缓存,如果还没有向根域名服务器发出请求查找目标域名,如果没有就转下一级,直到找到位置。
2.ARP地址解析协议:已经得到IP地址了,寻找MAC地址,先查主机缓存的ARP列表,如果没有则向一个网络内的主机广播一个数据包,数据包里面是源主机ip,源主机mac,目的主机ip,收到消息的主机比对自己的ip地址,如果一样,则将源主机的ip,mac更新到自己的ARP列表里,然后将自己的mac地址用数据包返回给源主机,如果不是就将数据包丢弃。
3.建立连接:三次握手,四次挥手
4.根据SpringMVC后台业务返回数据,并将数据填充到HTML页面上,然后返回给浏览器;浏览器进行处理后进行网页渲染

35.Http的请求方式有哪些?
get:用来请求资源
post:用来请求服务器数据处理,一般会造成已有资源的修改或者新资源的建立
head:请求返回一个报文头部
put:从客户端向服务器传输的数据取代指定文档的内容
delete:请求服务器删除指定的页面
connect:http1.1协议中预留给能够将连接改为管道方式的代理服务器
options:允许客户端查看服务器的性能
trace:用来回显服务器的请求,通常用来测试或诊断。
图片说明

36.Socket编程

37.session与cookies的区别,以及分别存储在什么地方?

38.常见的状态码
100:
200:
201:
202:
301:
302:
303:
400:
403:
404:
501:

39.五层协议简述
物理层(比特流):传输比特流。作用是尽可能的屏蔽传输媒体和通信手段差异,使数据链路层感受不到这些差异。(集线器:对接收到的信号进行整形在放大,并将所有节点集中在以它为中心的节点上)PPP

数据链路层(帧):点到点传输,将网络层传下来的数据报分组封装成帧。要进行链路管理、差错控制、流量控制等(网桥:隔离冲突域,划分子网端***换机:集线器是广播式,交换机是可以根据端口地址将消息传输给对应的端口。)

网络层(数据报):分组与路由转发,实现路由选择、差错控制和拥塞控制等(路由器:将数据从一个子网转发到另一个子网。为经过路由器的每一个数据帧寻找到一条最优路径,并转发过去)IP/ICMP/OSPF

传输层(报文段):端到端的数据传输,进程与进程之间的数据传输.TCP/UDP

应用层(报文):为特定应用进程提供数据传输服务。FTP/SMTP/HTTP/DNS