1.OSI与TCP/IP各层的结构与功能,都有用哪些协议
- 应用层的任务是通过进程间的交互来完成特定网络应用。主要协议,HTTP协议
- 运输层的主要任务就是负责向两台主机进程之间的通信提供通用的数据传输服务。主要使用以下两种协议:传输控制协议TCP--提供面向连接的,可靠的数据传输服务。用户数据协议UDP--提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)
- 网络层的任务就是选择合适的网间路由和交换结点,确保数据及时传送。---IP协议
- 数据链路层。两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。在两个相邻节点之间传送数据的时候,数据链路层将网络层交下来的IP数据报组装成帧。
- 物理层的作用是实现相邻计算机之间比特流的透明传输,尽可能屏蔽掉具体传输介质和物理设备的差异。
2.TCP三次握手和四次挥手
为了准确无误地把数据送达目标处,TCP协议采用了三次握手策略。
- 客户端-发送带有SYN标志的数据包-一次握手-服务端
- 服务端-发送带有SYN/ACK标志的数据包-二次握手-客户端
- 客户端-发送带有ACK标志的数据包
为什么要三次握手
三次握手的目的是建立可靠的通信信道,说道通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。
不是两次握手的原因:
- 防止已过期的连接请求突然又传送到服务器,因而产生错误和资源浪费
- 三次握手才能让双方均确认自己和对方的的发送和接收能力都正常
- 告知对方自己的初始序号值,并确认收到对方的初始序号值
为什么要三次握手,而不是四次:
因为三次握手已经可以确认双方的发送接收能力正常,双方都知道彼此已经储备好,而且也可以完成对双方初始序号值得到确认,也就无需再第四次握手了
- 第一次握手:服务端确认“自己收、客户端发”报文功能正常。
- 第二次握手:客户端确认“自己发、自己收、服务端收、客户端发”报文功能正常,客户端认为连接已建立。
- 第三次握手:服务端确认“自己发、客户端收”报文功能正常,此时双方均建立连接,可以正常通信。
SYN是TCP/IP建立时的握手信号;ACK是确认字符,表示确认发来的数据已经接收无误。
什么是SYN洪泛攻击?如何防范?
SYN洪泛攻击是属于DOS攻击的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源。
检测:挡在服务器上看到大量的半连接状态时,特别是源ip地址是随机的,基本可以断定这是一次SYN攻击。
防范:
- 通过防火墙、路由器等过滤网关保护。
- 通过加固TCP/IP协议栈防范,如增加最大半连接数,缩短超时时间
- SYN cookies技术。SYN cookies是对TCP服务器端的三次握手做一些修改,专门用来防范SYN洪泛攻击的一种手段。
三次握手连接阶段,最后一次ACK包丢失,会发生什么?
服务端:
- 第三次的ACK在网络中丢失,那么服务端在该TCP连接的状态为SYN-RECV,并且会根据TCP超时重传机制,会等待3,6,12S后重新发送SYN+ACK包,以便客户端重新发送ACK包
- 如过重发指定次数后,仍未收到客户端ACK的应答,那么一段时间后,服务端自动关闭这个俩连接
客户端:
- 客户端认为这个连接已经建立,如果客户端向服务端发送数据,服务端以RST包响应。此时客户端知道第三次握手失败
断开一个TCP连接则需要四次挥手:
- 客户端-发送一个FIN,用来关闭客户端到服务器的数据发送。
- 服务端-收到这个FIN,它发回一个ACk,确认序号为收到的序号加1.和SYN一样,一个FIN将占用一个序号。
- 服务器-关闭与客户端的连接,发送一个FIN给客户端
- 客户端-发回ACK报文确认,并将确认序号位置为收到序号加1
为什么要四次挥手
任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后完全关闭了TCP连接。
为什么客户端的TIME-WAIT状态必须等待2MSL?
- 确保ACK报文能够到达服务端,从而使服务端正常关闭连接。
- 防止已失效的连接请求报文段出现在之后的连接中。
如果已经建立了连接,但是客户端出现了故障怎么办?
通过定时器+超时重试机制,尝试获取确认,直到最后会自动断开连接。
具体而言:TCP设有一个计时器。服务端每收到一次客户端的数据,都会重新复位这个计时器,时间通常设置为2个小时。若两个小时还没有收到客户端的任何数据,服务器就开始重试;每隔75分钟发送一个探测报文段,若一连发送10个探测报文后依然没有回应,那么服务器就认为连接已经断开
3.TCP,UDP协议的区别
4.TCP协议如何保证可靠传输
- 应用数据被分割成TCP认为最适合发送的数据块
- TCP给发送的每一个包进行排序,把有序的数据传送给应用层。
- 校验和:TCP将保持它首部和数据的校验和。这是一个端到端的校验和,目的是检测数据在传输过程中的任何变化。
- TCP的接收端会丢弃重复的数据
- 流量控制:TCP连接的每一方都有固定大小的缓冲空间,TCP接收端只允许发送端发送接收端缓冲区能接纳的数据。TCP使用的流量控制协议是可变大小的滑动窗口协议。
- 拥塞控制:当网络拥塞时,减少数据的发送
- ARQ协议:也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。
- 超时重传:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
5.ARQ协议
自动重传请求,它通过使用确认和超时这两个机制,在不可靠服务的基础上实现可靠的信息传输。如果发送方在发送后的一段时间之内没有收到确认帧,它通常会重新发送。ARQ包括停止等待ARQ协议和连续ARQ协议
停止等待ARQ协议,优点:简单。缺点:信道利用率低,等待时间长
连续ARQ协议:优点:信道利用率高,容易实现,即使确认丢失,也不必重传。
6.滑动窗口和流量控制
TCP利用滑动窗口实现流量控制。流量控制是为了控制发送方发送速率,保证接收方来得及接收。接收方发送的确认报文中的窗口字段可以用来控制发送发窗口大小,从而影响发送方的发送速率。
7.拥塞控制
拥塞控制就是为了防止过多的数据注入到网络中,这样就可以使网络中的路由器或链路不致过载。
TCP的拥塞控制采用了四种算法:慢开始、拥塞避免、快重传和快恢复。
8.在浏览器中输入url地址->>显示主页的过程(面试常客)
总体来说分为以下几个过程
- DNS解析 :域名分析,将域名解析为IP地址
- TCP连接
- 发送HTTP请求
- 服务器处理请求并返回HTTP报文
- 浏览器解析渲染页面
- 连接结束
DNS解析:
- 浏览器先检查自身缓存有没有被解析过的这个域名对应的IP地址,如果有,解析结束
- 如果浏览器缓存中还没有,浏览器会检查操作系统缓存中有没有对应的已解析过的结果。
- 如果至此还没有命中域名,才会真正的请求本地域名服务器(LDNS)来解析这个域名
- 如果LDNS仍然没有命中,就直接跳到root Server域名服务器请求解析
- 根域名服务器会返回给LDNS一个所查询的主域名服务器(gTLD)地址
- 此时LDNS再发送请求给上一步返回的gTLD
- 接收请求的gTLD查找并返回这个域名对应的Name Server的地址,这个Name Server就是网站注册的域名服务器
- Name Server根据映射关系表找到目标ip,返回给LDNS
- LDNS返回这个域名对应的ip
- LDNS把解析的结果返回给用户,用户根据TTL值缓存到本地系统缓存中,域名解析过程到此结束
DNS的查询方式:
递归查询和迭代查询是站在客户端的角度来进行区分的,如果客户端只提交一次请求,然后等着上一级的DNS服务器为它返回解析结果,这成为递归查询。如果客户端向多个DNS服务器提交了请求,才获得了解析结果,这边是迭代查询
- 递归查询:客户端每次都将解析的请求层层递交给上一层DNS服务器,当某一个域DNS服务器解析来了该域名对应的IP地址,又将解析结果层层上传
- 迭代查询:客户端向上一级DNS服务器提交请求时,上一级DNS服务器并不直接处理请求,上一级DNS服务器如果又对应的解析结果,直接返回给本地DNS服务器,如果没有,它会告诉客户端:我这里无法解析这个域名,但是我知道哪个DNS服务器可以处理,你可以去问,然后客户端又去问xxxDNS服务器
9.状态码
常见的状态码
- 200:服务器已成功处理了请求
- 301:(永久移动)请求的网页已经永久移动到新的位置
- 302:(临时移动)服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置俩进行以后的请求。
- 400:客户端请求有语法错误,不能被服务器所理解
- 403:服务器收到请求,但是拒绝提供服务
- 404:服务器找不到请求的网页
- 500:服务器遇到错误,无法完成请求。
重定向原因:
- 网站调整(如改变网页目录结构)
- 网页被移到有一个新的地址
- 网页扩展名改变
10.各种协议与HTTP协议之间的关系
12.HTTP长连接和短连接
在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP通信就要断开一次TCP连接,
比如,使用浏览器浏览一个包含多张图片的HTML页面的时候,在发送请求访问HTML页面资源的同时,也会请求该HTML页面里包含的其他资源。因此每次的请求都会造成无谓的TCP连接建立和断开,增加通信量的开销
HTTP/1.1,默认使用长连接,也称为HTTPkeep-alive,用以保持连接特性。
其特点是只要任意一端没有明确提出断开连接,则保持TCP连接状态。
长连接的好处: 在于减少了TCP连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载。另外,减少开销的那部分时间,使HTTP请求和响应能够更早的结束,这样Web页面的显示速度也就相应提高了。
实现长连接需要客户端和服务端都支持长连接。
13.HTTP1.0和HTTP1.1的主要区别
- 长连接:在1.0中默认使用的是短连接。
- 错误状态响应码:1.1中新增了24个错误状态响应码
- 缓存处理:在1.0中主要使用header里的If-Modified-Since,Expires来做缓存判断的标准,在1.1中则引入了更多的缓存控制策略。
- 带宽优化以及网络连接的使用
HTTP1.1和HTTP2.0的区别?HTTP2.0支持的特性
- 新的二进制格式:前者是基于文本,后者基于二进制
- 多路复用:即连接共享,每一个request都可以用作连接共享机制的
- 头部压缩:HTTP1.1的头部带有大量的信息,而且每次都要重复发送;HTTP2.0使用encorder来减少需要传输的header大小
- 服务端推送: 服务器除了最初请求的响应外,服务器还可以额外的向客户端推送资源,而无需客户端明确的请求。
14,URI和URL的区别是什么?
- URI是统一资源标志符,可以标识一个资源。
- URL是统一资源定位符,可以提供该资源的路径。它是一种具体的URI,即URL可以用来标识一个资源,而且还致命了如何locate这个资源。
15.HTTP和HTTPS的区别?
- 端口:HTTP的URL由“http://”起始且默认使用端口80,而HTTPS的URL由“https://”起始且默认使用端口443
- 安全性和资源消耗:HTTP协议运行在TCP之上,所有的传输的内容都是明文,客户端和服务端都无法验证对方的身份。HTTPS是运行在SSL/TLS之上的HTTP协议,SSL/TLS运行在TCP之上,所有传输的内容都经过加密。HTTP安全性灭有HTTPS高,但是HTTPS比HTTP耗费更多的服务器资源。
HTTPS的原理:
- 客户端请求HTTPS网址,然后连接到server的443端口
- 采用HTTPS协议的服务器必须要有一套数字CA证书。颁发证书的同时会产生一个私钥和公钥。私钥由服务端自己保存,不可泄露。公钥则是附带在证书的信息中
- 服务器响应客户端请求,将证书传递给客户端,证书中包含公钥和大量其他信息
- 客户端解析证书并且进行验证;证书没有问题后,客户端会从证书中取出服务器的公钥A。然后客户端还会生成一个随机码KEY,并使用公钥A将其加密。
- 客户端把加密后的随机码KEY发送给服务器,作为后面对称加密的秘钥
- 服务器在收到随机码KEY之后会使用私钥B将其解密。这样就建立起了安全连接,完美解决了对称加密的密钥泄露问题。
- 服务器使用秘钥(随机码KEY)对数据进行对称加密并发送给客户端,客户端使用相同的秘钥(随机码KEY)解密数据。
- 双方使用对称加密传输所有数据
16HTTP请求协议包和Http响应协议包
Http请求协议包 | Http响应协议包 |
请求行:URL:请求地址 method:请求方式 | 状态行:Http状态码 |
请求头:cookie,请求参数[get] | 响应头:cookie content-type编译器 |
空白行:起到隔离作用 | 空白行 |
请求体:请求参数[post] | 响应体:文件内容【二进制】 |
17.get和post的区别
携带的【请求参数数量】不能超过4K | 可以携带任意数量的【请求参数】 |
必须在浏览器地址栏上将【请求参数信息】展示出来 | 必须在浏览器地址栏上隐藏请求参数信息 |
必须将请求参数信息保存在Http请求协议包中【请求头】 | 必须将参数信息保存在Http请求协议包中【请求体】 |
要求浏览器在接收到服务器返回的资源文件内容后,必须即资源文件内容保存在浏览器的缓存 | 禁止浏览器将服务器返回资源文件内容进行保存,必须【阅后即焚】 |
18.重定向和请求转发区别
用户第一次通过【手动方式】通知浏览器访问OneServlet。 在浏览器接收到响应包之后,会读取到302状态。此时浏览器 | 用户第一次通过手动方式要求浏览器访问OneServlet。 OneServlet工作完毕后,通过当前的请求对象代替浏览器 向Tomcat发送请求,申请调用TwoServlet。 Tomcat在接收到这个请求之后,自动调用TwoServlet来 完成剩余任务 |
19.Cookie的作用什么?和Session有什么区别?
Cookie和Session都是用来跟踪浏览器用户身份的回话方式,但是两者的应用场景不太一样。
Cookie一般用来保存用户信息。Session的主要作用就是通过服务端记录用户的状态
Cookie数据保存在客户端(浏览器端),Session数据保存在服务器端
20.什么是Cookie和Session?
什么是Cookie
HTTP Cookie是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。
- 回话状态管理(用户登录状态、购物车、游戏分数或其它需要记录的信息)
- 个性化设置(如用户自定义设置、主题等)
- 浏览器行为跟踪(跟踪分析用户行为)
什么是Session
Session代表着服务器和客户端一次会话的过程。
Session对象存储特定用户会话所需的属性及配置信息。当用户在应用程序的web页之间跳转的时候,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当客户端关闭会话,或者Session超时失效时会话结束。
21.Cookie和Seesion是如何配合的
- 用户第一次请求服务器的时候,服务器根据用户提交的相关信息,创建对象的Session,请求返回时将此Session的唯一标识信息SessionID返回给浏览器,浏览器接收到服务器返回的SessionID信息后,会将此信息存入Cookie中,同时Cookie记录此SeesionID属于哪个域名。
- 当用户第二次访问服务器的时候,请求会自动判断此域名下是否存在Cookie信息,如果存在也自动将Cookie信息也发送到服务端,服务端会从Cookie中获取SessionID,再根据SessionID查找对应的Session信息,如果没有找到说明用户没有登录或者登录失效,如果找到Session证明用户登录可执行后面操作。
22.Cookie和Session的区别:
- 作用范围不同:Cookie保存在客户端,Session保存在服务端
- 存取方式不同:Cookie只能保存ASCII,Session可以存任意数据类型
- 有效期不同:Cookie可设置长时间保持,Session一般失效时间较短,客户端关闭或者Session超时都会失效。
- 隐私策略不同:Cookie存储在客户端,比较容易遭到不法获取;Session存储在服务端,安全性要好一些
- 存储大小不同:单个Cookie保存的数据不能超过4K,Session可存储数据远高于Cookie
23.如何考虑分布式Seesion问题?
在互联网公司为了可以支撑更大的流量,后端往往需要多台服务器更同支撑前端用户请求,那如果用户在A服务器登录了,第二次请求跑到服务B就会出现登录失效问题
- 客户端存储:直接将信息存储在Cookie中
- Nginx ip-hash策略:服务端使用Nginx代理,每个请求按访问Ip的hash分配,这样来自同一IP固定访问一个后台服务器,避免了在A服务器创建Session,第二次分发到服务器B的现象
- Session复制:任何一个服务器上的Session发生改变(增删改),该节点会把这个Session的所有内容序列化,然后广播给其他节点。
- 共享Session:服务端无状态的话,将用户的Session等信息使用缓存中间件(如Redis)来同一管理,保障分发到每一个服务器的响应结果都一致。
24.什么是DDos攻击?
Distributed Denial of Service,分布式拒绝攻击。最基本的DOS攻击过程
- 客户端向服务端发送请求链接数据包
- 服务端向客户端发送确认数据包
- 客户端不向服务端发送确认数据包,服务器一直等待来自客户端的承认
预防方法:
- 减少SYN timeout时间。在握手的第三步,服务器会等待30-120S的时间,减少这个等待时间就能释放更多的资源。
- 限制同时打开的SYN半连接数目
25.什么是XSS攻击?
cross-site scripting 跨站脚本。这种攻击是由于服务器将攻击者存储的数据原原本本的显示给其他用户所致的。
预防措施:前端:过滤;后端:转义
26.SQL注入是什么,如何避免SQL注入?
SQL注入的原理主要有以下4点:
- 恶意拼接查询
- 利用注释执行非法命令
- 传入非法参数
- 添加额外条件
避免SQL注入的一些方法:
- 限制数据库权限,给用户提供仅仅能够满足其工作的最低权限
- 对进入数据库的特殊字符转义处理
- 提供参数化查询接口,不要直接使用原生SQL
27.负载均衡算法有哪些?
多台服务器以对称的方式组成一个服务器集合,每个服务器都具有等价的地位,能够互相分担承载
- 轮询法:将请求按照顺序轮流的分配到服务器上
- 随机法:随机获取一台
- 哈希法:通过ip地址哈希化来确定要选择的服务器编号。好处是,每次客户端访问的服务器都是同一个服务器,能很好的利用session和cookie
- 加权轮询:根据服务器性能不同加权。