网络协议相关
网络协议
-
OSI七层结构
- 应用层
- 表示层
- 会话层:半双工、单工和全双工的方式建立会话。
- 传输层:该层的主要任务是:向用户提供可靠的端到端的差错和流量控制,保证报文的正确传输。该层常见的协议:TCP协议、UDP协议。
- 网络层:寻址
- 数据链路层:流量控制,将物理层的数据
- 物理层:计算机之间基础的比特流
-
OSI七层模型分别对应着五层模型的哪一部分;
OSI模型 TCP/IP分层
应用层(HTTP)
表示层(HTML)
会话层 ----------> 应用层
传输层 ----------> 传输层(TCP、UDP)
网络层 ----------> 互联网络层(IP)
数据链路层(ARP)-> 网卡层
物理层 ----------> 硬件层 -
网络模型的分层、IP和Mac地址在那个层、TCP和HTTP分别在那个层;
- ip和mac地址在网络层
- tcp在数据传输层
- http在应用层
HTTP/HTTPS
-
Https和Http有什么区别;
一、HTTPS协议需要到证书颁发机构CA申请证书,HTTP不用申请证书;二、HTTP是超文本传输协议,属于应用层信息传输,HTTPS 则是具有SSL加密传安全性传输协议,对数据的传输进行加密,相当于HTTP的升级版;
三、HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
四、HTTP的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。
-
https的加密怎么实现的
CA证书+SSL加密 -
Http为什么是无状态的;
- 原先http协议只是用来访问静态页面,无需状态。
- 后来http协议得到广泛使用,某些场景需要记录状态,针对这种场景可以用session或者cookies来记录状态,无需对http自身进行改造。
-
http1.0、http 1.1和http2.0的区别;
http演化历史-
http/1.0:如需要发送多个请求必须创建多个 TCP 连接,并且浏览器对于单域名请求有数量限制(一般6个),其连接无法被复用
-
http/1.1:引入流水线(Pipelining)技术,但先天 FIFO(先进先出)机制导致当前请求的执行依赖于上一个请求执行的完成,容易引起报头阻塞,并没有从根本上解决问题
-
http/2:重新定义底层 http 语义映射,允许同一个连接上使用请求和响应双向数据流。同一域名只需占用一个 TCP 连接,通过数据流(Stream)以帧为基本协议单位,从根本上解决了问题,避免了因频繁创建连接产生的延迟,减少了内存消耗,提升了使用性能
-
RPC(在dubbo篇重点看)
什么是RPC、如何实现RPC、RPC 的实现原理
网络IO
参考多路复用,在netty篇重点看
连接
-
什么是长连接和短连接
所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持。
短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接,一般银行都使用短连接。
比如http的,只是连接、请求、关闭,过程时间较短,服务器若是一段时间内没有收到请求即可关闭连接。
其实长连接是相对于通常的短连接而说的,也就是长时间保持客户端与服务端的连接状态。 -
长连接与短连接的操作过程
通常的短连接操作步骤是:
连接→数据传输→关闭连接;而长连接通常就是:
连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接;
这就要求长连接在没有数据通信时,定时发送数据包(心跳),以维持连接状态,短连接在没有数据传输时直接关闭就行了 -
什么时候用长连接,短连接?
长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,下次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。
而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。
总之,长连接和短连接的选择要视情况而定。
TCP、IP/UDP协议(传输层)
tcp可以参照这两个文档,讲的比较清楚
深入理解TCP协议(上):理论基础
深入理解TCP协议(下):RTT、滑动窗口、拥塞处理
tcp重点关注的知识点
- 三次握手、四次挥手和状态流转
- 建立socket依靠多路复用
- 失败重传
- 重复数据处理
- 可靠传输、包乱序问题
- 流量控制(滑动窗口)
- 拥堵处理(粘包、拆包)
知识点列表
-
全双工、半双工、单工
- 全双工(Full Duplex)是指在发送数据的同时也能够接收数据,两者同步进行,这好像我们平时打电话一样,说话的同时也能够听到对方的声音。目前的网卡一般都支持全双工。
- 半双工(Half Duplex),所谓半双工就是指一个时间段内只有一个动作发生,举个简单例子,一条窄窄的马路,同时只能有一辆车通过,当目前有两量车对开,这种情况下就只能一辆先过,等到头儿后另一辆再开,这个例子就形象的说明了半双工的原理。早期的对讲机、以及早期集线器等设备都是基于半双工的产品。随着技术的不断进步,半双工会逐渐退出历史舞台.
- 单工通信是指通信线路上的数据按单一方向传送.
-
三次握手
建立连接前的校验动作,确保双方都是可以接收数据的。 -
为什么握手不是两次或者四次,是三次?
TCP 需要 seq 序列号来做可靠重传或接收,而避免连接复用时无法分辨出 seq 是延迟或者是旧链接的 seq,因此需要三次握手来约定确定双方的 ISN(初始 seq 序列号)。 -
TCP三次握手数据丢失了怎么办?那如果后面又找到了呢?
数据丢失,快速重发(SACK)
重复数据过滤,Duplicate SACK,当ack大于后面的SACK时,发送方就知道这个数据已经发送过,丢失的应该是ACK。 -
TCP的失败重传
- 超时重传
- 快速重传
- SACK方法
- Duplicate SACK方法
-
四次挥手是什么,为什么不能减少为三次,或者变得更多?
-
SYN攻击
使用随机的ip,伪造SYN请求,将机器的syn连接的队列耗尽。- tcp_synack_retries 可以用他来减少重试次数;
- tcp_max_syn_backlog,可以增大SYN连接数
- tcp_abort_on_overflow 处理不过来干脆就直接拒绝连接了。
-
tcp的状态流转
tcp状态流转 -
tcp在time_wait状态到closed状态为什么要等待两个MSL
- TIME_WAIT确保有足够的时间让对端收到了ACK,如果被动关闭的那方没有收到Ack,就会触发被动端重发Fin,一来一去正好2个MSL
- 有足够的时间让这个连接不会跟后面的连接混在一起(你要知道,有些自做主张的路由器会缓存IP数据包,如果连接被重用了,那么这些延迟收到的包就有可能会跟新连接混在一起)
-
RTT算法
记录消息从发送到接收回来消耗的时长,存在以下问题?
重传的时间要不要计算进去?- 经典算法,计算了重传时间
- 改良算法,没有计算重传时间,当网络抖动需要重传很多时,会有大问题,所以这里取巧,如果发生重传,超时时间*2
- 继续改良,将重传时间加权,用加权因子,整出一个公式,调的一手好参数。
-
tcp的流控,sliding windows 滑动窗口
发送方窗口示例 -
TCP的拥塞控制、流量控制详细说明?
-
什么是TCP 粘包/拆包,TCP粘包/拆包的解决办法
TCP 粘包/拆包的原因及解决方法 -
UDP协议和TCP协议的比较、TCP为什么可靠;
TCP/IP协议-为什么说TCP是可靠连接
快速理解为什么说UDP有时比TCP更有优势
网络层
-
两个不同ip地址的计算机之间如何通信;
计算机之间是如何互相通信的 -
地址解析协议ARP;
【是什么】
透过目标设备的ip地址,查询目标设备的mac地址,以保证通信的顺利进行。【怎么做】(缓存->广播->匹配->更新缓存)
- 每个运行tcp/ip协议的主机上都会有arp高速缓存表,缓存了目标ip地址与mac地址的映射关系。
- 先从缓存中找,找不到会在本局域网上发送广播。
- 局域网内所有接收到的arp进程,会取报文跟自身比较ip地址,如果匹配,向发送方发送消息。
- 发送方接收到之后,更新本地缓存表。
-
从浏览器中输入URL到页面加载的发生了什么?
数据链路层
-
数据链路层是做什么的?
- 主要的作用:将不稳定的物理层传输,转化为稳定的数据链路传输,将比特流聚合转为帧
- 因为两端数据处理能力的不同,数据链路层,需要具备流量控制的能力
-
数据链路层的流量控制方法?
相关联问题
-
C10k问题
-
长短URL相互转换方案(同笔试题,问我方案可以有多少不同URL,高并发怎么办,怎样建立索引以及怎样分布式)
在分布式系列中重点分析
-
多路复用
在netty篇重点看