Interview - network

# 传统以太网帧

1500 + 14(头) + 4 (CRC) = 1518 (bytes)
在这里插入图片描述


# MSS和MTU

MSS是TCP连接在SYN时进行协商的,代表的最大数据长度,1460的计算是指 1500减去20字节IP头长度和20字节TCP头长度


# 802.11帧(MPDU,MAC PDU)类型:管理帧,控制帧,数据帧

管理帧:用于创建、维持、终止站和接入点之间的连接;确定是否采用加密、传输网络名称(SSID/ESSID)、支持哪种传输速率、采用的时间数据库。

控制帧:RTS(请求发送),CTS(明确发送)/ACK(确认);RTS和CTS通过放缓传输来进行流量控制,当启动RTS/CTS时,一个站在发送数据帧之前发送一个RTS帧,当接收方愿意接收额外的流量时,响应一个CTS帧。组播或者广播帧没有ACK确认,以防止"ACK爆炸"。

数据帧:数据帧分片,聚合,片偏移


# 802.11省电模式(PSM)

AP发送 “信标帧” (一种管理帧)来提供不同信息,如SSID、信道和认证信息。某站执行PSM后,直到接收到下一个AP信标帧,才通信会苏醒过来,并确认AP中是否有为它缓存的帧。


# IP协议的设计目标

将网络层软件使用的地址和底层网络硬件使用的地址进行转换,为跨越不同类型物理网络的分组交换提供互操作。


# ARP 和 RARP

地址解析是发现两个地址之间的映射关系的过程。ARP提供网络层逻辑地址到相关硬件地址的动态映射(可能会随时间变化)。RARP用于缺少磁盘驱动器的系统,在引导时获取设备的硬件地址。ARP属于广播,只能用于同一子网。点到点链路(PPP)不使用ARP,在链路建立后,链路两端通知正在使用的地址,由于不涉及硬件地址,因此不需要地址解析或者ARP。

ARP缓存:维护网络层地址到硬件地址的最新映射,使得ARP高效运行,正常到期时间是20min。"arp -a"查询。

代理ARP(混杂ARP、ARP黑客):使一个系统可回答不同主机的ARP请求。它使ARP请求的发送者认为作出响应的系统就是目的主机,但实际目的主机可能在其他地方或者不存在。

免费ARP:ARP请求方请求和通告的IP地址都是请求方的IP地址,两个作用:确认是否收到应答以确定是否出现IP地址冲突;ARP接收方通过ARP请求更新自己的ARP缓存。

ARP攻击:代理ARP;ARP缓存静态条目处理。


# IPv4 / IPv6头

IPv4头长度:20 ~ 60 (15 * 4)

IPv6头长度:40(定长,地址长度128位);扩展头部可以在需要时添加,通过 “下一个头部” 来进行无限扩展,扩展头部的类型可以是IPv6扩展头部或者是传输层头部。
在这里插入图片描述


# IP数据报长度

由16位长度字段控制,最大长度65535字节(包括头长)。以太网会将短帧填充到最小长度(64字节),以太网最小有效载荷为46字节,但IP数据报最小长度为20字节,所以IP需要长度字段来确定以太网帧中IP数据报的真正长度。


# IP转发

IP层包括一些位于内存中的信息,通常称作路由表或转发表,每次转发一个数据报需要从中查找信息。当一个网络接口接收到一个数据报时,IP层首先检查目的地址是否是自己的IP地址或者是可以接收流量的其他地址(如IP广播或组播地址),如果是,则IP数据报交付给IPv4头部协议字段或者IPv6头部的 “下一个头部” 字段指定的协议模块。如果数据报的目的地址不是本地IP模块使用的IP地址:如果IP层配置成一台路由器,则转发该数据报,作为一个输出的数据报处理;否则默默丢弃,对于ICMP消息,可能发送回源节点,以表明一个错误。


# 路由表

包含:目的地(32位IPv4,或者128位IPv6)、掩码、下一跳、接口

不包含任何目的地的完整转发路径,指明下一跳比该转发系统更接近目的地,并且下一跳路由器与执行转发的系统直接连接(在同一个子网中或者PPP链路的两端)。数据报不会在网络中循环,知道TTL或者跳数限制到期。


# IP直接交付和间接交付

直接交付:目的IP在同一子网中或者PPP链路对端,查找路由表发现下一跳的IP为本机IP,则IP数据报被链路层封装,经过ARP请求获取目的地的链路层地址进行发送。

间接交付:涉及路由器,数据转发到这台路由器中,并使用路由器的链路层地址作为目的地址,路由器的IP地址没有出现在IP数据报中(除非路由器自己是源主机或目的主机,或使用源路由)。


# IP攻击

基于选项操作,由于一个或多个IP头部字段无效,可以使路由器崩溃或者性能下降。

伪造源路由地址,早期的访问控制机制基于源IP地址。

ICMP攻击。

Internet服务基本要素

IP地址,子网掩码,DNS服务器IP,路由器IP。这些都是通过DHCP获取的。


# DHCPv4过程

协议:UDP/IPv4,客户端端口:68,服务器端口:67,服务器IP:255.255.255.255(有限广播地址)

DHCPDISCOVER -> DHCPOFFER(IP、DNS、Gateway、子网掩码、租用时间T、更新时间T1(T / 2)、重新绑定时间T2(7T / 8)) -> DHCPREQUEST -> DHCPACK -> ARP(ACD警告) -> DHCPDECLINE -----------(10s)-------> DHCPDISCOVER

拒绝:DHCPNAK 放弃:DHCPRELEASE 获取除地址外的其他信息:DHCPINFORM

地址续约:DHCPREQUEST


# 网络地址转换(NAT,Network Address Translation)

NAT使得互联网地址不需要全球唯一,在互联网的不同部分(地址范围)可被重复使用,缓解了IP地址耗尽的问题。

缺点:互联网上的用户无法直接访问处于NAT内部的具有私有地址的主机。需要跟踪每个关联的或连接的连接状态,其操作贯穿多个协议层,修改IP层地址的同时也要修改传输层的校验码。

NAT:利用地址池中的地址重写NAT内部请求的IP地址,不重写端口号

NAPT(Network Address Port Translation):也称作IP伪装,使用传输层标识符(TCP / UDP端口,ICMP查询标识符)来确定一个特定的外来数据包到底和NAT内部的哪台私有主机关联。将所有NAT主机的IP地址都重写一个IP地址,有时必须重写端口号或者ICMP标识,以避免冲突。(如:书中P213)

IP分片情况下,对于不是第一个分片,没有端口号,NAT在这样的情况下可能会出错。


# 防火墙

包过滤防火墙:对网络层和传输层报头中的各个部分进行比较,丢弃或者转发

代理防火墙:是运行一个或多个应用层网关(Application-Layer Gateway,ALG)的主机,该主机拥有多个网络接口,能够在应用层中继两个连接/关联之间的特定类型的流量。不作IP转发,应用层的TCP/UDP连接在此终止。如HTTP代理防火墙,SOCKS防火墙。


# 防火墙规则

Iptables:使用NetFilter的网络过滤功能来实现

3个表格:filter,nat,mangle

filter:处理基本的包过滤,包含INPUT,FORWARD,OUTPUT 3条链

nat:PREROUTING,OUTPUT,POSTROUTING

mangle:


# ICMP报文类型

有关IP数据报传递的ICMP报文(差错报文):目的不可达(路径MTU,PMTUD(ICMP PTB消息))、重定向(更新路由表)、超时(TTL,源路由,traceroute)、参数问题。(传递给用户进程或者传输层协议)

有关信息采集和配置的ICMP报文(查询或信息类报文):回显请求 / 回显应答(ping)、路由器发现(路由器通告、路由器请求)。(操作系统自动处理)


# 以下情况不会响应ICMPv4差错报文:

ICMPv4差错报文(除了ICMPv4查询类报文)、目的地址是IPv4广播地址或组播地址的数据报、链路层广播的数据报、不是第一个分片的其他分片、源地址不是某个主机的数据报(如零地址,环回地址,广播地址,组播地址)。


# 使用traceroute进行源路由和路径MTU发现

使用UDP或ICMP,不断改变TTL或者MTU,且端口号设定成目的IP主机未使用的端口号。

目的主机不可达 -> 目的端口不可达:确认路径MTU(改造后的traceroute,设定不同的MTU,P349)

TTL超时 -> 目的端口不可达:确认源路由


# PING如何区分进程

发送主机利用ICMP PING 标识符来分离返回的应答,在UNIX中,常将进程ID放置在标识符中,来确认哪个进程发送。Android中并不是这样,ID呈现从0/1递增的方式。


# 与ICMP相关的攻击

主要分为3类:泛洪(产生大量流量,如PING 广播地址,导致针对一台或多台计算机的有效的DoS攻击)、炸弹(发送经过特殊构造的报文,导致IP或者ICMP的处理崩溃)、信息泄露、ICMP重定向使用一个不准确的系统作为下一跳路由器、ICMP路由器通告一个不准确的路由器、ICMP目的不可达导致拒绝服务(Smack攻击)。


# 四种IP地址

单播、组播(224.0.0.0 - 239.255.255.255)、任播(是一个IPv4/IPv6单播地址,根据所在的网络确定不同的主机,任播地址不是Internet中的一台主机,而是最合适或者最接近的一台主机)、广播(255.255.255.255称为本地有限广播)


# 广播和组播

将分组交付至多个目的地,如DHCP。IPv6支持组播但不支持广播。一般使用在UDP / ICMPv4 传输协议上,TCP不支持广播和组播。 链路层以太网广播地址(ff:ff:ff:ff:ff:ff),IP广播最终是被包装成链路层广播帧中。

广播寻址 / 组播寻址

组播:任源组播(只要是特定的组播地址,则接收),特定源组播(包含或排除一组特定发送方的组播)


# UDP

不提供差错纠正、队列管理、重复消除、流量控制、拥塞控制。提供 差错检测(通过传输层校验和)。

优点:无连接,减少开销,广播和组播使用UDP进行无连接传输

在这里插入图片描述


# TCP
在这里插入图片描述


# 端口号(16 bit)

IP层根据协议字段或IPv6下一个头部字段将进入IP层的数据分离到特定的传输层协议中,因此端口号在不同的传输层协议之间是独立的,因此,TCP端口号只能被TCP使用,UDP端口号只能被UDP使用,两个完全不同的服务器可以使用相同的IP地址和端口号,只要使用的传输层协议不同即可。


# IP分片 / 重组 (P347)

根据协商的MTU进行分片,只到目的地才会重组:减轻中间路由器转发的负担;每个分片经过的路由器不同,路由器可能没有能力对分片进行重组。

分片由IPv4头部的标识(frag)、分片偏移(分片负载的第一个字节在原始IPv4数据中的偏移量,8字节为单位)、更多分片 来控制。

分片对于防火墙和NAT来说,是一个复杂的因素,因为端口号只在第一个分片中包含,其他分片不包含传输层协议头部信息。

更大偏移量的分片要比第一个分片优先投递:接收主机通过片偏移和IPv4数据报长度确定所需缓存空间的最大值。(P348)


# 拥塞控制算法

4个阶段:慢启动,拥塞避免,快重传,快恢复


# HTTPS,HTTP

通信使用明文,容易被窃听;不验证通信方的身份,可能遭遇伪装;无法证明报文的完整性,可能遭遇篡改。

HTTPS:HTTP + SSL (Secure Socket Layer,安全套接层)

HTTPS = HTTP + 加密 + 认证 + 完整性保护

SSL:数据加密,防止被窃听;通过第三方颁发的证书来确定服务器和客户端是真实存在的,这就确定了通信方的身份。

SSL加密和解密(公开密钥加密):使用一对非对称的密钥(似有密钥和公开密钥),发送方使用公开密钥进行加密,接收方使用似有密钥解密。

共享密钥加密:发送方和接收方使用同一个密钥进行加密和解密。

HTTPS使用共享密钥和公开密钥加密方式结合的混合加密机制。公开加密方式处理复杂,利用公开密钥加密方式传输共享密钥,之后只用共享密钥加密方式进行加密。

SSL握手:ClentHello -> ServerHello -> Certificate -> ServerHello Done -> ClientKeyExchange -> ChangeCipherSpec -> Handshake Finished -> ChangeCipherSpec -> Handshake Finished


# SSL,TLS

目前基本使用的是SSL 3.0,TLS是以SSL为原型开发的协议,SSL的加密和解密消耗CPU资源,传输消耗网络资源,因此HTTPS的速度会比HTTP的速度慢2到100倍。


# HTTP身份认证

BASIC认证(基本认证),DIGEST认证(摘要认证),SSL客户端认证,FormBase认证(基于表单认证)

BASIC认证 & DIGEST认证:服务器发送401状态码提示客户端发送用户名和密码组成的Authorization给服务器。对于HTTP而言,没有对认证信息进行加密,具有危险性。另外,对已进行BASIC认证后的浏览器,一般无法实现认证注销,不灵活。

SSL客户端认证:需要第三方颁发的证书

表单认证:类似邮箱登陆的方式,由于HTTP是无状态的协议,需要Cookie对Session进行管理


# Cookie & Session

  1. 服务器对每个客户端的连接发送SessionID,客户端使用表单认证后,服务器使用客户端的登录信息进行身份认证,将用户的认证状态与SessionID绑定并保存在服务端。

  2. 服务器向客户端相应时,在HTTP手部Set-Cookie字段中写入Session ID

  3. 客户端接收服务器端发送来的Session ID 并将其作为Cookie保存在本地,下次向服务器请求时,客户端自动发送该Cookie。

  4. 服务器端根据客户端发送的Session ID 识别用户和其登录状态


# HTTP的瓶颈

  1. 一条连接上只可发送一个请求

  2. 请求只能从客户端开始。客户端不可以接收除响应以外的指令

  3. 请求 / 响应首部未经压缩就发送,首部信息越多延迟越大

  4. 发送冗长的首部,每次互相发送相同的首部造成的浪费较多

  5. 可任意选择数据压缩格式,非强制压缩发送

解决方式:

  1. Ajax(异步JavaScript与XML):利用JS和DOM(Document Object Model),达到局部Web页面替换加载的异步通信手段。由于只更新一部分页面,相应中传输的数据量会减少。但没有解决HTTP的实际问题。

  2. Comet:使用“延迟应答”的方式实现推送功能。Comet将对客户端的相应挂起,当服务器端有内容更新时,返回该相应。缺点:为了保留响应,一次连接的持续时间变长,且为了维持连接会消耗更多的资源。

  3. SPDY:在HTTP(应用层)和SSL(表达层)间加入SPDY会话层,控制对数据的流动。


# SPDY(SpeeDY,发音同speedy)

  1. 多路复用流:通过单一的TCP连接处理多个HTTP请求,所有请求的处理都在一条TCP连接上完成

  2. 请求优先级:给请求分配优先级,解决在处理多个请求时,由于低带宽导致相应慢的问题

  3. 压缩HTTP首部:减少通信数据包数量和字节

  4. 推送功能:支持服务器主动向客户端推送数据的功能

  5. 服务器提示功能:服务器可以主动提示客户端请求所需要的资源,客户端在资源已缓存的情况下,可以避免不必要的请求。


# okHttp

Interceptors(责任链设计模式):

责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

RetryAndFollowUpInterceptor -> BridgeInterceptor -> CacheInterceptor -> CallServerInterceptor

主要成员对象:

Call:对请求的封装,有异步请求和同步请求。

Dispatcher:任务调度器

Connection:是RealConnection的父类接口,表示对JDK中的物理socket进行了引用计数封装,用来控制socket连接

HttpCodec:对Http请求进行编码,对Http响应进行解码,由于Http协议有基于HTTP1.0和Http2.0的两种情况,Http1Code代表基于Http1.0协议的方式,Http2Code代表基于Http2.0协议的方式。

StreamAllocation:用来控制Connections/Streams的资源分配与释放

RouteDatabase:用来保存连接的错误路径,以便能提升连接的效率。

RetryAndFollowUpInterceptor:负责失败重试以及重定向的拦截器

BridgeInterceptor:负责把用户构造的请求转换为发送到服务器的请求、把服务器返回的响应转为用户友好的响应的

CacheInterceptor:负责读取缓存直接返回、更新缓存(DiskLruCache)

ConnectInterceptor:负责和服务器建立连接的

CallServerInterceptor:负责向服务器发送请求数据、从服务器读取响应数据

OkHttp的复用连接池:

Http有一种叫做keepalive connections的机制,而okHttp支持5个并发socket连接,默认keepalive时间为5分钟。

executor线程池:类似于CachedThreadPool,需要注意的是这种线程池的工作队列采用了没有容量的SynchronousQueue。

Deque 双向队列:双端队列同时具有队列和栈的性质,经常在缓存中被使用,里面维护了RealConnection也就是Socket物理连接的包装。

RouteDatabase :它用来记录连接失败的路线名单,当连接失败时就会把失败的路线加进去。


# 断点续传原理

设定从 2000070 偏移处开始传输

httpConnection.setRequestProperty(“RANGE”,“bytes=2000070”);

通过 RandomAccessFile 将文件指针移到偏移处,继续写文件

RandomAccess oSavedFile = new RandomAccessFile(“down.zip”,“rw”);
long nPos = 2000070;
// 定位文件指针到 nPos 位置
oSavedFile.seek(nPos);
byte[] b = new byte[1024];
int nRead;
// 从输入流中读入字节流,然后写到文件中
while((nRead=input.read(b,0,1024)) 》 0)
{
  oSavedFile.write(b,0,nRead);
}

http://www.pgygho.com/help/fwq/9184.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章