一.概述
1. **OSI与TCP/IP各层的结构与功能,都有哪些协议?
OSI分层 (7层):物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
TCP/IP分层(4层):网络接口层、 网际层、运输层、 应用层。
五层协议 (5层):物理层、数据链路层、网络层、运输层、 应用层。
1.1 应用层(FTP、DNS、Telnet、SMTP、HTTP、NFS)(报文)
应用层的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则。
1.2 表示层(JPEG、MPEG、ASII)
处理信息的表示方法,如数据加密解密,压缩解压,转换翻译
1.3 会话层(NFS、SQL、NETBIOS、RPC)
建立端链接并提供访问验证和会话管理
1.4 运输层(TCP、UDP)(报文段)
运输层的主要任务就是负责向两台主机进程之间的通信提供通用的数据传输服务。
1.5 网络层(IP、ICMP、ARP、RARP、OSPF、IPX、RIP、IGRP、BGP)(路由器)(数据报,包)
网络层的任务就是选择合适的网间路由和交换结点, 确保数据及时传送。
1.6 数据链路层(PPP、FR、HDLC、VLAN**、MAC** )(网桥,交换机)(帧)
链路层负责将分组从一个节点移动到路径上的下一个节点。
1.7 物理层(比特流)
物理层(physical layer)的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异,
2.**在浏览器中输入url地址 ->> 显示主页的过程
1、客户端浏览器通过DNS解析到www.baidu.com的IP地址220.181.27.48,通过这个IP地址找到客户端到服务器的路径。客户端浏览器发起一个HTTP会话到220.161.27.48,然后通过TCP进行封装数据包,输入到网络层。
2、在客户端的传输层,把HTTP会话请求分成报文段,添加源和目的端口,如服务器使用80端口监听客户端的请求,客户端由系统随机选择一个端口如5000,与服务器进行交换,服务器把相应的请求返回给客户端的5000端口。然后使用IP层的IP地址查找目的端。
3、客户端的网络层不用关系应用层或者传输层的东西,主要做的是通过查找路由表确定如何到达服务器,期间可能经过多个路由器,这些都是由路由器来完成的工作,我不作过多的描述,无非就是通过查找路由表决定通过那个路径到达服务器。
4、客户端的链路层,包通过链路层发送到路由器,通过邻居协议查找给定IP地址的MAC地址,然后发送ARP请求查找目的地址,如果得到回应后就可以使用ARP的请求应答交换的IP数据包现在就可以传输了,然后发送IP数据包到达服务器的地址。
3. CDN
内容分发网络(CDN)是一种新型网络构建方式,它是为能在传统的IP网发布宽带丰富媒体而特别优化的网络覆盖层;而从广义的角度,CDN代表了一种基于质量与秩序的网络服务模式。
CDN的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求
二.应用层
0. HTTP有哪些方法,GET和POST的区别
- get请求:
将请求参数追加在url后面,不安全
url长度限制get请求方式数据的大小
没有请求体 - post请求:
请求参数在请求体处,较安全。
请求数据大小没有限制 - head请求:
跟GET相似,不过服务端接收到HEAD请求时只返回响应头,不发送响应内容。
所以,如果只需要查看某个页面的状态时,用HEAD更高效,因为省去了传输页面内容的时间。 - delete请求:
删除某一个资源。 - put:向指定资源位置上传其最新内容。
0.5. HTTP请求报文和响应报文格式,请求行和响应行都有什么
- HTTP 请求报文由请求行、请求头部、空行 和 请求包体 4 个部分组成
请求行:请求行由方法字段、URL 字段 和HTTP 协议版本字段 3 个部分组成,他们之间使用空格隔开。常用的 HTTP 请求方法有 GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT; - HTTP 响应报文由状态行、响应头部、空行 和 响应包体 4 个部分组成,
状态行:状态行由 HTTP 协议版本字段、状态码和状态码的描述文本 3 个部分组成
1.状态码
2. HTTP长连接,短连接
在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话。
而从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这行代码:
Connection:keep-alive
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。
HTTP/1.1的持续连接有非流水线方式和流水线方式 。流水线方式是客户在收到HTTP的响应报文之前就能接着发送新的请求报文。与之相对应的非流水线方式是客户在收到前一个响应后才能发送下一个请求
HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。
3.HTTP是不保存状态的协议,如何保存用户状态?
HTTP 是一种不保存状态,即无状态(stateless)协议。也就是说 HTTP 协议自身不对请求和响应之间的通信状态进行保存。Session 机制的存在就是为了解决这个问题,Session 的主要作用就是通过服务端记录用户的状态。典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了(一般情况下,服务器会在一定时间内保存这个 Session,过了时间限制,就会销毁这个Session)。
在服务端保存 Session 的方法很多,最常用的就是内存和数据库(比如是使用内存数据库redis保存)。既然 Session 存放在服务器端,那么我们如何实现 Session 跟踪呢?大部分情况下,我们都是通过在 Cookie 中附加一个 Session ID 来方式来跟踪。
Cookie 被禁用怎么办?
最常用的就是利用 URL 重写把 Session ID 直接附加在URL路径的后面。
4.**HTTP 1.0和HTTP 1.1的主要区别是什么?
1.长连接 : 在HTTP/1.0中,默认使用的是短连接,HTTP 1.1起,默认使用长连接 ,默认开启Connection: keep-alive。 **HTTP/1.1的持续连接有非流水线方式和流水线方式 。**流水线方式是客户在收到HTTP的响应报文之前就能接着发送新的请求报文。与之相对应的非流水线方式是客户在收到前一个响应后才能发送下一个请求。
2.错误状态响应码 :在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
3.缓存处理 :在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
4.带宽优化及网络连接的使用 :HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
5.HTTP 1.1增加host字段
在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。
HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。此外,服务器应该接受以绝对路径标记的资源请求。
4.5 http1.1与http 2.0的主要区别
1、多路复用:
HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级。HTTP1.1也可以多建立几个TCP连接,来支持处理更多并发的请求,但是创建TCP连接本身也是有开销的。
- 在 HTTP1 中浏览器限制了同一个域名下的请求数量(Chrome下一般是六个),当在请求很多资源的时候,由于队头阻塞,当浏览器达到最大请求数量时,剩余的资源需等待当前的六个请求完成后才能发起请求。
HTTP2 中引入了多路复用的技术,这个技术可以只通过一个 TCP连接就可以传输所有的请求数据。多路复用可以绕过浏览器限制同一个域名下的请求数量的问题,进而提高了网页的性能。
2、二进制分帧
在不改动http/1.x的语义、语法、状态吗、URI以及首部字段……的情况下,http/2是如何作做到“突破http1.1的性能限制,改进传输性能,实现低延迟和高吞吐量”的?
关键之一就是在应用层(http/2)和传输层(TCP or UDP)之间增加一个二进制分帧层。
3、首部压缩
http1.1不支持header数据的压缩,http2.0使用HPACK算法对header的数据进行压缩,这样数据体积小了,在网络上传输就会更快。
4、服务器推送
服务端推送是一种在客户端请求之前发送数据的机制。
在http/2中,服务器可以对客户端的一个请求发送多个响应。
Server Push 让http1.x时代使用内嵌资源的优化手段变得没有意义;
意思是说,当我们对支持http2.0的web server请求数据的时候,服务器会顺便把一些客户端需要的资源一起推送到客户端,免得客户端再次创建连接发送请求到服务器端获取。这种方式非常合适加载静态资源。
服务器推送可以缓存,并且在遵循同源的情况下,不同页面之间可以共享缓存。
因此当客户端需要的数据已缓存时,客户端直接从本地加载这些资源就可以了,不用走网络,速度自然是快很多的。
5.HTTP 3.0 (QUIC)
QUIC (Quick UDP Internet Connections), 快速 UDP 互联网连接。
QUIC是基于UDP协议的。
两个主要特性:
- 线头阻塞(HOL)问题的解决更为彻底:
基于TCP的HTTP/2,尽管从逻辑上来说,不同的流之间相互独立,不会相互影响,但在实际传输方面,数据还是要一帧一帧的发送和接收,一旦某一个流的数据有丢包,则同样会阻塞在它之后传输的流数据传输。而基于UDP的QUIC协议则可以更为彻底地解决这样的问题,让不同的流之间真正的实现相互独立传输,互不干扰。 - 切换网络时的连接保持:
当前移动端的应用环境,用户的网络可能会经常切换,比如从办公室或家里出门,WiFi断开,网络切换为3G或4G。基于TCP的协议,由于切换网络之后,IP会改变,因而之前的连接不可能继续保持。而基于UDP的QUIC协议,则可以内建与TCP中不同的连接标识方法,从而在网络完成切换之后,恢复之前与服务器的连接。
6. HTTP 和 HTTPS 的区别?
- 端口 :HTTP的URL由“http://”起始且默认使用端口80,而HTTPS的URL由“https://”起始且默认使用端口443。
- 安全性和资源消耗: HTTP协议运行在TCP之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。HTTPS是运行在SSL/TLS之上的HTTP协议,SSL/TLS 运行在TCP之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。所以说,HTTP 安全性没有 HTTPS高,但是 HTTPS 比HTTP耗费更多服务器资源。
6.5. HTTPS中间人攻击及解决方案
中间人攻击:中间人截取客户端发送给服务器的请求,然后伪装成客户端与服务器进行通信;将服务器返回给客户端的内容发送给客户端,伪装成服务器与客户端进行通信。
通过这样的手段,便可以获取客户端和服务器之间通信的所有内容。
使用中间人攻击手段,必须要让客户端信任中间人的证书,如果客户端不信任,则这种攻击手段也无法发挥作用。
解决方案:
造成中间人劫持的原因是 没有对服务端证书及域名做校验或者校验不完整,为了方便,直接采用开源框架默认的校验方式进行https请求,如volley
预防方式有两种
- 针对安全性要求比较高的 app,可采取客户端预埋证书的方式锁死证书,只有当客户端证书和服务端的证书完全一致的情况下才允许通信,如一些银行类的app,但这种方式面临一个问题,证书过期的问题,因证书有一定的有效期,当预埋证书过期了,只有通过强制更新或者要求用户下载证书来解决。
- 针对安全性要求一般的app,可采用通过校验域名,证书有效性、证书关键信息及证书链的方式
7.服务及其对应端口
服务 端口号 服务 端口号
FTP 21 SSH 22
telnet 23 SMTP 25
Domain(域名服务器) 53 HTTP 80
POP3 110 NTP(网络时间协议) 123
MySQL数据库服务 3306 Shell或 cmd 514
POP-2 109 SQL Server 1433
9. ETag响应头
Etag 响应头字段表示资源的版本,浏览器第一次请求一个资源时,服务器返回资源并添加Etag,浏览器再次发送请求时会带 If-None-Match 头字段, 来询问服务器该版本是否仍然可用。如果服务器发现该版本仍然是最新的, 就可以返回 304 状态码指示 UA 继续使用缓存。
10. 域名有哪些信息
域名可以划分为各个子域,子域还可以继续划分为子域的子域,这样就形成了顶级域、二级域、三级域等。
如下图所示:
其中顶级域名分为:国家顶级域名、通用顶级域名、反向域名。
国家顶级域名 中国:cn, 美国:us,英国uk…
通用顶级域名 com公司企业,edu教育机构,gov政府部门,int国际组织,mil军事部门 ,net网络,org非盈利组织…
反向域名 arpa,用于PTR查询(IP地址转换为域名)
11. XSS攻击和CSRF 跨站点请求伪造
- XSS,是一种代码注入攻击。攻击者向网页中注入恶意脚本,当用户浏览网页时,脚本就会执行,进而影响用户,比如关不完的网站、盗取用户的 cookie 信息从而伪装成用户去操作,危害数据安全。
- CSRF 跨站请求伪造,是一种挟制用户在当前已登录的 Web 应用程序上执行非本意的操作的攻击方法。如:攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。
CSRF与 XSS 区别
- 通常来说 CSRF 是由 XSS 实现的,CSRF 时常也被称为 XSRF
- 本质上讲,XSS 是代码注入问题,CSRF 是 HTTP 问题,XSS 是内容没有过滤导致浏览器将攻击者的输入当代码执行。CSRF 则是因为浏览器在发送 HTTP 请求时候自动带上 cookie,而一般网站的 session 都存在 cookie里面(Token验证可以避免)
12. CSRF防御
- token;token 验证的 CSRF 防御机制是公认最合适的方案。但若网站同时存在 XSS 漏洞的时候,这个方法也是空谈
- 验证码;强制用户必须与应用进行交互,才能完成最终请求。此种方式能很好的遏制 csrf,但是用户体验比较差
- Referer check;请求来源限制,此种方法成本最低,但是并不能保证 100% 有效,因为服务器并不是什么时候都能取到 Referer,而且低版本的浏览器存在伪造 Referer 的风险
13. XSS攻击防范
- 产生xss攻击漏洞主要是因为服务器没有对用户输入进行编码和过滤。另一个原因是,这种攻击方法有很多变体,攻击的手法却不断翻新,要设计出一个能完全防御的XSS过滤器是非常困难的。
- 防范xss攻击的原则就是不相信用户输入的数据
- HttpOnly
将重要的cookie标记为http only, ,浏览器将禁止页面的 JavaScript 访问带有 HttpOly 属性的 Cookie。
HttpOnly 主要是为了解决 XSS 之后的 Cookie 劫持,使用 HttpOnly 有助于缓解 XSS 攻击,防止被窃取敏感的 Cookie信息,本质上不是为了解决 XSS。 - 消毒
- 在输入输出时对数据进行转义,比如<转义成<,这样脚本就运行不了了
- 录入数据设置白名单,比如javaWeb项目,设置过滤器过滤特殊字符
- 前端页面限制用户输入数据类型,比如用户输入完年龄后验证输入内容只能是数字
- 过滤JS事件的标签,比如onclick、load等
14. DNS解析过程
- 当客户机提出查询请求时,首先在本地计算机的缓存中查找,如果在本地无法查询信息,则将查询请求发给DNS服务器
- 首先客户机将域名查询请求发送到本地DNS服务器,当本地DNS服务器接到查询后,首先在该服务器管理的区域的记录中查找,如果找到该记录,则进行此记录进行解析,如果没有区域信息可以满足查询要求,服务器在本地缓存中查找
- 如果本地服务器不能在本地找到客户机查询的信息,将客户机请求发送到根域名DNS服务器
- 根域名服务器负责解析客户机请求的根域名部分,它将包含下一级域名信息的DNS服务器地址地址,返回给客户机的DNS服务器地址
- 客户机的DNS服务器利用根域名服务器解析的地址访问下一级DNS服务器,得到再下一级域名的DNS服务器地址
- 按照上述递归方法逐级接近查询目标,最后在有目标域名的DNS服务器上找到相应IP地址信息
- 客户机的本地DNS服务器将递归查询结构返回客户机
- 客户机利用从本地DNS服务器查询得到的IP访问目标主机,就完成了一个解析过程
- 同时客户机本地DNS服务器更新其缓存表,客户机也更新期缓存表,方便以后查询
15. DNS的递归查询和迭代查询
递归查询就好比是我问A同学一个问题,他不知道,于是他就去问B同学,如果B知道,就告诉A,A再告诉我结果,如果B也不知道,那么就继续向C问,知道A知道答案,告诉我,最终也是A和我直接交互。
迭代查询就好比我问A同学问题,A不知道,但是A告诉我,B知道,你去问B吧,于是B告诉了我答案,这就是与上面递归的区别。如下图所示:
查询过程中,递归查询和迭代查询可能会都使用,客户和本地服务器之间采用递归查询,服务器之间采用迭代查询,可能会多次迭代。
迭代查询的逻辑顺序按照域名系统的域名结构中的层次去查询
16. DNS基于哪种传输层协议,什么时候使用TCP
从依赖关系的角度看,DNS既可以基于TCP,也可以基于UDP,常用的是UDP,服务器则使用知名端口53.
DNS对UDP或TCP的使用有一下原则;
- 使用A查询请求某个域名对应的IP地址时使用UDP;
- 如果响应报文长度大于512字节,则UDP仅返回前512字节,并设置报文首部“参数”字段的“截断”位。客户在收到这个响应后,会使用TCP重新发送原来的请求;
- 如果一次查询的名字很多,则客户可能会直接使用TCP;
- 在主域名服务器和辅助域名服务器之间进行区域传送时,使用TCP。
DNS的规范规定了2种类型的DNS服务器,一个叫主DNS服务器,一个叫辅助DNS服务器。
在一个区中主DNS服务器从自己本机的数据文件中读取该区的DNS数据信息,而辅助DNS服务器则从区的主DNS服务器中读取该区的DNS数据信息。当一个辅助DNS服务器启动时,它需要与主DNS服务器通信,并加载数据信息,这就叫做区传送(zone transfer)。
17. 域名劫持和域名投毒
- 域名劫持(DNS劫持)
域名服务器上有很多域名记录,当收到域名查询请求时,域名服务器先在记录中查找,返回给对方。如果域名服务器上的记录被人为修改成错的,一旦查询就会得到错误的地址。(应对方法:直接访问IP地址) - 域名污染(域名欺骗、域名缓存投毒)
电脑向域名服务器发送查询请求,到电脑收到回答中间存在一定时间差。域名污染就是在电脑收到“DNS应答”前,先伪造一个错误的发给电脑。
三.传输层
****1.TCP 三次握手
- server处于Listen状态,表示服务器端的某个SOCKET处于监听状态,可以接受连接了;
- 第一次:当client端socket执行connect连接时,首先发送SYN报文到server,进入SYN_SENT状态,等待server发送ACK;
- 第二次:server接受到SYN进入SYN_RCVD状态,(很短暂,一般查询不到),发送SYN+ACK给client端;
- 第三次:client端接受到server的ACK,发送ACK给server,server接收到后进入established状态,client也进入established状态。
2. 为什么要三次握手
三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。
第一次握手:Client 什么都不能确认;Server 确认了对方发送正常,自己接收正常
第二次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:对方发送正常,自己接收正常
第三次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己发送、接收正常,对方发送、接收正常
所以三次握手就能确认双发收发功能都正常,缺一不可。
3.第2次握手传回了ACK,为什么还要传回SYN?
接收端传回发送端所发送的ACK是为了告诉客户端,我接收到的信息确实就是你所发送的信号了,这表明从客户端到服务端的通信是正常的。而回传SYN则是为了建立并确认从服务端到客户端的通信。
3.5 TCP三次握手第三次握手时ACK丢失怎么办
- 当Client端收到Server的SYN+ACK应答后,其状态变为ESTABLISHED,并发送ACK包给Server;
- 如果此时ACK在网络中丢失,那么Server端该TCP连接的状态为SYN_RECV,并且依次等待3秒、6秒、12秒后重新发送SYN+ACK包,以便Client重新发送ACK包。
Server重发SYN+ACK包的次数,可以通过设置/proc/sys/net/ipv4/tcp_synack_retries修改,默认值为5。
- 如果重发指定次数后,仍然未收到ACK应答,那么一段时间后,Server自动关闭这个连接。
- 但是Client认为这个连接已经建立,如果Client端向Server写数据,Server端将以RST包(用于强制关闭tcp连接)响应,方能感知到Server的错误。
3.6 TCP快速打开(fast-open),TCP三次握手完成前可以传输数据吗
TCP快速打开(TCP Fast Open,TFO)是对TCP的一种简化握手手续的拓展,用于提高两端点间连接的打开速度。简而言之,就是在TCP的三次握手过程中传输实际有用的数据。这个扩展最初在Linux系统实现,Linux服务器,Linux系统上的Chrome浏览器,或运行在Linux上的其他支持的软件。
它通过握手开始时的SYN包中的TFO cookie来验证一个之前连接过的客户端。如果验证成功,它可以在三次握手最终的ACK包收到之前就开始发送数据,这样便跳过了一个绕路的行为,更在传输开始时就降低了延迟。这个加密的Cookie被存储在客户端,在一开始的连接时被设定好。然后每当客户端连接时,这个Cookie被重复返回。
4.TCP四次挥手,什么要四次挥手
- client发起断开连接,给server发送FIN,进入FIN_WAIT1状态,表示client想主动断开连接;
- server接受到FIN字段后,会继续发送数据给client端,并发送ACK给client端,表明自己知道了,但是还没有准备好断开,请等我的消息,进入CLOSE-WAIT状态;
- 当server确定自己的数据已经发送完成,就发送FIN到client;进入LAST_ACK状态
- client接受到来自server的FIN,发送ACK给server端,表示可以断开连接了,进入TIME-WAIT状态再等待2ms,没有收到server端的数据后,表示可以正常断开连接。
TCP是全双工的,主动方发送断开请求后被动方可能还有数据没发完,因此需要等待被动方数据发完后再进行两次挥手
5.如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75分钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
5.5 TIMEWAIT大量出现的原因
高并发,短连接的TCP服务器,服务器处理完请求后立刻主动正常关闭连接,则会出现大量TIMEWAIT
解决方案:1)并发量高的业务尽量使用长连接
2)编辑内核文件/etc/sysctl.conf开启回收机制,减少timeout时间,限制tiemout桶数目,减少端口分配范围
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout 修改系默认的 TIMEOUT 时间
5.6 服务端大量close_wait可能是什么造成的
如果一直保持在CLOSE_WAIT状态,那么只有一种情况,就是在对方关闭连接之后服务器程序自己没有进一步发出ack信号。换句话说,就是在对方连接关闭之后,程序里没有检测到,或者程序压根就忘记了这个时候需要关闭连接,于是这个资源就一直 被程序占着。
所以如果将大量CLOSE_WAIT的解决办法总结为一句话那就是:查代码。因为问题出在服务器程序里头啊。
你的程序有问题!
5.7 客户端收到大量close_wait可能是什么造成的
- close_wait是被动关闭的一方才有的,可能是客户端正在接收数据,服务端发送fin包给客户端,此时会出错**由tcp返回一个ack包,**所以客户端会有大量close_wait.
- 可能server端的程序超时或 server端的程序在发送ack后忘了再发fin造成的
6.****TCP,UDP 协议的区别
区别 TCP UDP
1.连接 面向连接 面向非连接
2.可靠性 可靠 非可靠
3.有序性 有序 不保证有序
4.速度 慢 快
5.量级 重量级 轻量级
6.拥塞控制或流量控制 有 没有
7 面向字节流,无记录边界 面向报文,有记录边界
8 只能单播 可以广播或组播
9.应用场景 效率低,准确性高 效率高,准确性低
若通信数据完整性需让位与通信实时性,则应该选用 TCP 协议(如文件传输、重要状态的更新等);反之,则使用 UDP 协议(如视频传输、实时通信等)
7.TCP 协议如何保证可靠传输
- 校验和: TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
- 序号:TCP 给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层,且通过序号可以去除重复数据
- 应答机制:当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒
- 超时重传: 当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
- 流量控制: TCP 连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。 (TCP 利用滑动窗口实现流量控制)
- 拥塞控制: 当网络拥塞时,减少数据的发送。
- 滑动窗口,流水线
8.拥塞控制算法
为了进行拥塞控制,TCP 发送方要维持一个 拥塞窗口(cwnd) 的状态变量。拥塞控制窗口的大小取决于网络的拥塞程度,并且动态变化。发送方让自己的发送窗口取为拥塞窗口和接收方的接受窗口中较小的一个。
TCP的拥塞控制采用了四种算法,即 慢开始 、 拥塞避免 、快重传 和 快恢复。在网络层也可以使路由器采用适当的分组丢弃策略(如主动队列管理 AQM),以减少网络拥塞的发生。
- 慢开始: 当主机开始发送数据时,由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值。cwnd初始值为1,每经过一个传播轮次,cwnd加倍。,如果发生超时则将cwnd设为1重新开始慢启动,并将ssthresh设为cwnd/2;
- 拥塞避免: 当cwnd到达ssthresh后,不再成倍增加拥塞窗口cwnd缓慢增大,即每经过一个往返时间RTT就把发送放的cwnd加1.
- 快重传:如果收到3个相同的ACK。TCP在收到乱序到达包时就会立即发送ACK,TCP利用3个相同的ACK来判定数据包的丢失,此时进行快速重传,快速重传做的事情有:
1.把ssthresh设置为cwnd的一半
2.把cwnd再设置为ssthresh的值(具体实现有些为ssthresh+3)
3.重新进入拥塞避免阶段。
后来的“快速恢复”算法是在上述的“快速重传”算法后添加的,当收到3个重复ACK时,TCP最后进入的不是拥塞避免阶段,而是快速恢复阶段。快速重传和快速恢复算法一般同时使用。快速恢复的思想是“数据包守恒”原则,即同一个时刻在网络中的数据包数量是恒定的,只有当“老”数据包离开了网络后,才能向网络中发送一个“新”的数据包,如果发送方收到一个重复的ACK,那么根据TCP的ACK机制就表明有一个数据包离开了网络,于是cwnd加1。如果能够严格按照该原则那么网络中很少会发生拥塞,事实上拥塞控制的目的也就在修正违反该原则的地方。
- 快恢复:1.当收到3个重复ACK时,把ssthresh设置为cwnd的一半,把cwnd设置为ssthresh的值加3,然后重传丢失的报文段,加3的原因是因为收到3个重复的ACK,表明有3个“老”的数据包离开了网络。
2.再收到重复的ACK时,拥塞窗口增加1。
3.当收到新的数据包的ACK时,把cwnd设置为第一步中的ssthresh的值。原因是因为该ACK确认了新的数据,说明从重复ACK时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进入拥塞避免状态。
8.2 TCP 延时应答/捎带应答
我们知道TCP中,有确认应答机制以保证数据的可靠传输。但是是不是接受方接受到数据就立即返回ACK应答呢?如果是这样,这时候的缓冲区中接收区的数据还没能够处理,缓存区的剩余大小就是窗口大小。
但是如果我们延迟一会,等待缓存区中数据被处理,那么剩余的缓存区就会大些——这就是延时应答。
ps:假设接收端缓存区大小为1M,一次接收到了500K的数据,现在缓存区中剩余大小为500。但如果我们延时一段时间,等待接受方处理了该缓存区中的数据,那么我们的剩余大小就为1M了(即:窗口大小)
等待的时间
每个操作系统中设置的等待时间是不一样的。(200ms)
是不是所有的包都可以延时应答?
1.数量限制:每隔两个包就应答一次
2.时间限制:超过最大延时时间就应答一次(200ms)
捎带应答
在延时应答的基础上,我们发现,接受方和发送方都是“一发一收”,所以,我们在发送数据的时候,我们把ACK搭顺风车的方式发送给对方了。
8.5 网络拥塞产生原因
- 缓冲区容量有限
- 传输线路的频带有限
- 节点处理能力有限
- 网络中某部分刚发生故障
8.DDOS攻击与解决方案
1)、DDos 攻击
客户端向服务端发送请求链接数据包
服务端向客户端发送确认数据包
客户端不向服务端发送确认数据包,服务器一直等待来自客户端的确认
2)、DDos 预防 ( 没有彻底根治的办法,除非不使用TCP )
- 限制同时打开SYN半链接的数目
- 缩短SYN半链接的Time out 时间
- 关闭不必要的服务
8.5 TCP三次握手哪一阶段最容易受到攻击
第三次,理由为DDOS攻击
9.UDP传输最大容量
1500-20-8=1472字节
10.TCP UDP伪首部
伪首部是为了UDP和TCP校验和存在的
- 伪首部并非TCP&UDP数据报中实际的有效成分。伪首部是一个虚拟的数据结构,其中的信息是从数据报所在IP分组头的分组头中提取的,既不向下传送也不向上递交,而仅仅是为计算校验和。
这样的校验和,既校验了TCP&UDP用户数据的源端口号和目的端口号以及TCP&UDP用户数据报的数据部分,又检验了IP数据报的源IP地址和目的地址。
10.5. TCP UDP校验和计算方法
- 首先将检验和部分添零;
- 然后将TCP伪首部部分,TCP首部部分,数据部分都划分成16位的一个个16进制数;
- 将这些数逐个相加,记得溢出的部分加到最低位上,这是循环加法:
0xc0a8+ 0x0166+……+0x0402=0x9b49 - 最后将得到的结果取反,则可以得到检验和位0x64B6
11. 如何实现UDP的可靠传输
1、实现方法:
(1)将实现放到应用层,然后类似于TCP,实现确认机制、重传机制和窗口确认机制;
(2)给数据包进行编号,按顺序接收并存储,接收端收到数据包后发送确认信息给发送端,发送端接收到确认信息后继续发送,若接收端接收的数据不是期望的顺序编号,则要求重发;(主要解决丢包和包无序的问题)
2、已经实现的可靠UDP:
-
RUDP 可靠数据报传输协议;
-
RTP 实时传输协议
为数据提供了具有实时特征的端对端传送服务;
Eg:组播或单播网络服务下的交互式视频、音频或模拟数据 -
UDT
基于UDP的数据传输协议,是一种互联网传输协议;
主要目的是支持高速广域网上的海量数据传输,引入了新的拥塞控制和数据可靠性控制机制(互联网上的标准数据传输协议TCP在高带宽长距离的网络上性能很差);
UDT是面向连接的双向的应用层协议,同时支持可靠的数据流传输和部分可靠的数据报服务;
应用:高速数据传输,点到点技术(P2P),防火墙穿透,多媒体数据传输;
12. TCP粘包是什么,有哪些原因
TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。
出现粘包现象的原因是多方面的,它既可能由发送方造成,也可能由接收方造成。
- 发送端需要等缓冲区满才发送出去,造成粘包
- 接收方不及时接收缓冲区的包,造成多个包接收
(1)发送方引起的粘包是由TCP协议本身造成的,TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一包数据。若连续几次发送的数据都很少,通常TCP会根据优化算法把这些数据合成一包后一次发送出去,这样接收方就收到了粘包数据。
(2)接收方引起的粘包是由于接收方用户进程不及时接收数据,从而导致粘包现象。这是因为接收方先把收到的数据放在系统接收缓冲区,用户进程从该缓冲区取数据,若下一包数据到达时前一包数据尚未被用户进程取走,则下一包数据放到系统接收缓冲区时就接到前一包数据之后,而用户进程根据预先设定的缓冲区大小从系统接收缓冲区取数据,这样就一次取到了多包数据。
一种比较周全的对策是:接收方创建一预处理线程,对接收到的数据包进行预处理,将粘连的包分开。
四.网络层
1.静态路由和动态路由有什么区别
静态路由是由管理员手工配置的,适合比较简单的网络或需要做路由特殊控制。而动态路由则是由动态路由协议自动维护的,不需人工干预,适合比较复杂大型的网络。
路由器能够自动地建立自己的路由表,并且能够根据实际实际情况的变化适时地进行调整。动态路由机制的运作依赖路由器的两个基本功能:对路由表的维护;路由器之间适时的路由信息交换。
2.网关,网桥的作用
网关用于实现网络的互联,狭义的讲,网关实质上是一个网络通向其他网络的IP地址。
在没有路由器的情况下,两个网络之间是不能进行TCP/IP通信的,即使是两个网络连接在同一台交换机(或集线器)上,TCP/IP协议也会根据子网掩码(255.255.255.0)判定两个网络中的主机处在不同的网络里。而要实现这两个网络之间的通信,则必须通过网关。如果网络A中的主机发现数据包的目的主机不在本地网络中,就把数据包转发给它自己的网关,再由网关转发给网络B的网关,网络B的网关再转发给网络B的某个主机(如附图所示)。网络B向网络A转发数据包的过程。
所以说,只有设置好网关的IP地址,TCP/IP协议才能实现不同网络之间的相互通信。那么这个IP地址是哪台机器的IP地址呢?网关的IP地址是具有路由功能的设备的IP地址,具有路由功能的设备有路由器、启用了路由协议的服务器(实质上相当于一台路由器)、代理服务器(也相当于一台路由器)。
网桥是一个局域网与另一个局域网之间建立连接的桥梁
3. IP首部检验和的计算?IP与ICMP,IGMP,TCP,UDP首部检验和的区别
1)首先把校验和字段清零;
2)然后对每 16 位(2 字节)进行二进制反码求和;
这里说的反码求和,不是说先对每 16 位求反码然后求和,而是说把每 16 位当做反码求和;
反码求和时,最高位的进位要进到最低位,也就是循环进位。
区别:ICMP,IP,UDP,TCP报头部分都有checksum(检验和)字段。IP 首部里的校验和只校验首部;ICMP、IGMP、TCP和UDP首部中的校验和校验首部和数据。(IPv6删除了检验和功能!)
由于IP报文在网络中传输时TTL是在变化的(每经过一个路由器减一),因此在路由器中要对 IP 首部重新校验。这也解释了为什么IP首部里的校验和只校验首部而不校验数据,因为如果数据也校验,那将给路由器增加巨大的负担。因此对数据校验的任务交给上层协议(TCP或UDP)。
4. IP路由表匹配特性
最长匹配原则,精准匹配的那bai条是优先的
5. 简述ICMP报文
- ICMP是因特网控制报文协议,被主机和路由器用来彼此沟通网络层的信息,最典型的用途是差错报告。
- ICMP报文是作为IP有效荷载承载的,其有一个类型字段表明传递的类型。
- ICMP分为差错报告报文和询问报文。差错报文例如告知网络,主机,端口不可达,TTL过期,IP首部损坏。询问报文如ping。
五.数据链路层
1.数据链路层协议可能提供的服务?
成帧、链路访问、透明传输、可靠交付、流量控制、差错检测、差错纠正、半双工和全双工。
最重要的是帧定界(成帧)、透明传输以及差错检测。
2. ARP协议的作用、简要原理
ARP(AddressResolutionProtocol)地址解析协议用于将计算机的网络地址(IP地址32位)转化为物理地址(MAC地址48位)[RFC826]。
假设我们的计算机IP地址是192.168.1.1,要执行这个命令:ping192.168.1.2。该命令会通过ICMP协议发送ICMP数据包。该过程需要经过下面的步骤:
1、应用程序构造数据包,该示例是产生ICMP包,被提交给内核(网络驱动程序);
2、内核检查是否能够转化该IP地址为MAC地址,也就是在本地的ARP缓存中查看IP-MAC对应表;
3、如果存在该IP-MAC对应关系,那么跳到步骤9;如果不存在该IP-MAC对应关系,那么接续下面的步骤;
4、内核进行ARP广播,目的地的MAC地址是FF-FF-FF-FF-FF-FF,ARP命令类型为REQUEST(1),其中包含有自己的MAC地址;
5、当192.168.1.2主机接收到该ARP请求后,就发送一个ARP的REPLY(2)命令,其中包含自己的MAC地址;
6、本地获得192.168.1.2主机的IP-MAC地址对应关系,并保存到ARP缓存中;
7、内核将把IP转化为MAC地址,然后封装在以太网头结构中,再把数据发送出去;