面试中的计算机网络
引言
计算机网络是CS基础中的一门重要课程,作为一名开发人员,网络通信也是开发中很重要的组成部分,所以计算机网络在面试中是必考的。在最近的面试中,我也被多次问道计算机网络方面的知识,特别是TCP协议的连接与关闭,必须要清楚掌握。那么现在废话不多说,下面是我自己复习计算机网络重点知识的笔记,不全面,主要是从OSI七层模型说起。
OSI 模型
- 物理层:主要任务是将比特流与电子信号进行转换。(方便在物理介质中传递)。
- 数据链路层:定义了通过通信介质相互连接的设置之间,数据传输的规范。(传递的是帧),通信介质两端的节点。
- MAC地址:48Bits,物理地址唯一,确定了唯一的物理设备。
- 分组交换:将较大的数据分割成若干较小的数据,然后依次发送。(原因是不同的数据链路有各自的最大传输单元)以太网的MTU为1500字节。
- 以太网帧:“前导码”——8字节。本体:
类型部分:存储的是上层的协议,比如IP协议,则编号是0800。
FCS部分:帧校验序列(Frame Check Sequence),用于判断帧在传输过程中是否有损坏(比如电子干扰等)。FCS保存着发送帧除以某个多项式的余数。
- 交换机:交换机是一种在数据链路层工作的设备,它有多个端口,可以连接不同的设备。
交换机根据每一帧中的目标MAC地址决定向哪个端口发送数据,此时它需要参考“转发表”。
转发表:不用手动设置,由交换机学习得到。
- 网络层:实现终端节点间的通信。IP协议是网络层的一个重要协议,网络层中还有ARP(获取MAC地址)和ICMP(数据发送异常通知)。数据链路层的作用在与实现同一种数据链路下的包传递,而网络层则是可以跨越不同的数据链路的包传递。
- IP协议可以分为三大功能模块:IP寻址,路由,IP分包。IP地址:由32位正整数表示,分为四部分,每部分8位整数,对应十进制(0-255)
网络标识用于区别不同的网段,相同的网段内的主机拥有相同的网络标识,不同的网络段内主机不能拥有相同的网络段标志。
主机标识用于区分同一网络段中的不同主机,它不能在同一网段中重复。
A类 IP地址第一位“0”。0.0.0.0 – 127.0.0.0(128个网段,实际能使用的126个网段),每一个网段主机数2的24次方,16,777,214个。
B类 IP地址前两位“10”。128.0.0.0 – 191.255.0.0,每一个网段主机数2的16次方,65534个
C类 IP地址前三位“110”。192.0.0.0 – 255.255.255.0,每一个网段主机数2的8次方,254个
D类 IP地址前四位“1110”。没有主机标识,因此常用于多播。
- 子网掩码子网掩码也是32位,1的长度表示的是网络标识,0表示的是主机标识。
- 路由控制路由控制是将分组数据发送到目标地址的功能,这一功能一般有路由器完成。路由控制的关键在与路由控制表,可以由管理员手动设置(静态路由控制),同时路由器也可以与其他路由器交换信息自动刷新路由表。信息交换的协议叫做“路由协议.”
- 环路路由器设置的默认路由形成一个环,而发送的目的IP地址找不到,就会无限循环,形成堵塞。
- IP报文分割重组IP协议的一个任务就是对数据进行分片和重组。
分片:发送端主机和路由器完成。
重组:由接收端主机负责。
- 路径MTU发现主机首先发送整个数据包,并将首部的禁止分片标志设为1。这样路由器在遇到需要分片才能处理的包时不会分片,而是直接丢弃并通过ICMP协议将不可达的消息发送回主机。主机将ICMP通知中的MTU设置为当前的MTU,根据整个MTU对数据进行分片处理。如此反复下去,直到不再收到ICMP通知,此时的MTU就是整个路径的MTU。
- IP首部(IPv4)
IP报的最大总长度65535字节(216)。
- 标识(ID: Identification)
- 标志:三个比特位
第一位:保留
第二位:是否分片
第三位:是否为最后一个包,1:不是,0:是。
- 片偏移:13个比特位,表示被分片的段相对于原始数据的位置。
- 生存时间(Time To Live)表示包可以经过多少路由器中转,每经过一个路由器,TTL减1。可以避免无限传递包的问题。
- 协议:表示IP首部的下一个首部属于哪一个协议。比如TCP协议的编号为6,UDP的协议为17。
- 首部校验和:用于检验IP首部是否损坏。
- 可选项:仅在试验或者诊断时用。
- DNS解析
DNS解析 域名================>IP地址
DNS请求不断向上传递,到达根DNS服务器,然后逐层下发。
- ARP协议ARP协议(Address Resolution Protocol)用于通过目标IP地址,定位下一个接受数据包的网络设备的MAC地址。如果目标主机处于同一个数据链路上,那么可以直接得到目标主机的MAC地址,否则将得到下一条路由器的MAC地址。
ARP协议的工作原理:ARP请求和AR响应。 - NAT和NAPT技术NAT(Network Address Translator)是一种将局域网中的私有地址转换成全局IP地址的技术。NAPT:在转换后的全局IP添加端口号。
都需要路由器维护内部的一张自动生成的地址转换表。
- IP协议可以分为三大功能模块:IP寻址,路由,IP分包。IP地址:由32位正整数表示,分为四部分,每部分8位整数,对应十进制(0-255)
- 传输层:实现应用程序之间的通信。常见的传输协议有TCP协议和UDP协议。TCP是:面向连接的,可靠的,点到点协议。(建立连接三步,关闭连接四步)
数据重传,流量控制等,保证接收方能够收到正确的数据。
UDP是:面向无连接,不可靠的,点到多点的协议。
不关心接收方是否真正收到数据。适合多播,实时视频和音频传输,个别数据的丢失不影响整体效果。
传输层协议中比网络层 IP 协议多了三个要素:源端口号,目标端口号,协议号。
不同的端口号用于区别同一台主机的不同应用程序。
协议号用于区分使用的是TCP还是UDP。
“源IP地址,目标IP地址,源端口号,目标端口号,协议号”这个五个信息只要有一个不同,就被认为是不同的通信。
- UDP首部
包长度包括UDP首部长度和数据长度值和。
校验和需要交验全部五个信息,即同时校验IP首部的信息。
- TCP首部
TCP连接效率低由TCP首部信息就可以看出,比较复杂。
- 序列号:表示发送数据的位置,发送的数据序列号=前一个序列号+前一个数据长度。
- 确认应答号:等于下一次应该接收到的数据序列号,接收端返回给发送端的确认应答号表示以前的数据已被正常接收。
- 数据偏移:TCP首部的长度,单位为4字节。
- 控制位:8比特。8个控制标志:CWR、ECE、URG、ACK、PSH、RST、SYN、FIN。
- 窗口大小:用于表示从应答号开始可以接受多少个8位字节。如果窗口的大小为0,可以发送窗口探测。
- 紧急指针:仅在URG控制位为1时有效。通常在暂时中断通信时使用。
- TCP握手通常情况下,我们认为客户端首先发起连接。三次握手:
第一次握手:建立连接时,客户端发送连接请求SYN=1,Seq=x到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到客户端连接请求,向客户端发送允许连接应答SYN=1,Seq=y,ACK=x+1,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的允许连接应答,向服务器发送确认ACK=y+1,客户端和服务器进入通信状态,完成三次握手。
(所谓的三次握手,就是要有三次连接信息的发送、接收过程。TCP连的建立需要进行三次连接信息的发送、接收。)
第三部ACK确认丢失怎么办?
按照TCP协议处理丢包的一般办法,服务端会重新向客户端发送数据包,直到收到ACK确认为止。这样可能出现SYN泛洪攻击。
争取的处理是服务端发送RST报文,连接信息全部初始化,TCP链接从第一次握手开始。
四次挥手:
第一次挥手:客户端发送一个FIN=1,ACK=Z,Seq=X,用来关闭客户到服务端的数据传送,主机1进入FIN_WAIT_1状态;
第二次挥手:服务端收到这个FIN,它发回ACK=X+1,主机1进入FIN_WAIT_2状态。
第三次挥手:服务端关闭与客户端的连接,发送一个FIN=1, Seq=Z,同时主机2进入CLOSE_WAIT状态;
第四次挥手:客户端发回ACK报文确认,ACK=Z+1,主机1进入TIME_WAIT状态,主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。
注意:关闭连接的最后一个ACK丢失怎么办?
在计时器2MSL时间内,如果服务端在没有收到ACK的情况下,发送的FIN没有到达,客户端关闭,最后服务端将永远无法关闭;如果在计时器时间内再次收到服务端FIN报文,客户端会重置计时器,并重新发送ACK给服务器。
- 数据包重发丢包的前提是发送方能够知道接收方是否成功的接受了消息。在TCP协议中,服务端会给客户端发送一个确认应答(ACK),这表示接收方已经正确收到了数据包。ACK确认 = 上一次发送的序号 + 数据长度。
TCP协议的机制是:发送方一段时间没有收到ACK,就会重新发送数据。
接收方通过TCP首部的SYN判断数据包是否曾经接受过,接收过的就直接丢弃。
- 重传超时时间(RTO,Retransmission Time Out)RTO时间是不固定的,它是一个动态变化的时间。总是略大于连接往返时间(RTT,Round Trip Time)RTO有自己的估算公式,不能太大,也不能太小。
- TCP窗口窗口的概念提高了TCP协议的传输效率和带宽利用率。如果数据丢失,那么发送端在接收到多次ACK不变的情况下,会重新发送丢失的包。(这就需要将发送过的数据缓存,以备重发)
如果ACK丢失,那么收到的不连续的ACK,可以认为中间的数据已经接受成功。因为接收方不会在没有数据的情况下增加ACK。
使用窗口可以理解为以空间换时间。
- 流量控制窗口过大,会导致接收方的缓存区溢出。窗口大小是一个可以由接收方控制的值,附加在TCP首部的窗口大小字段中。
慢启动:通信初期,窗口过大导致发送大量数据造成网络瘫痪,这就需要慢启动。
慢启动过程:
- 通信开始时,发送方的拥塞窗口大小为1,每收到一个ACK,拥塞窗口翻倍;
- 由于指数增长非常快,很快,就会出现确认包超时;
- 此时,设置一个面启动阈值,它的值是当前拥塞窗口的一半;
- 同时将拥塞窗口设为1,重新进入慢启动;
- 由于现在慢启动预知的存在,当拥塞窗口大小达到阈值,不再翻倍,而是线性增加;
- 随着窗口的不断增大,可能收到三次重复确认应答,进入快速复发阶段;
- 这时候,TCP将慢启动阈值设置为当前拥塞窗口的一半,再将拥塞窗口大小设置为阈值大小。
- 拥塞窗口又会线性增加,直至下一次出现三次重复确认应答或者超时。
- UDP首部
- 应用层:HTTP协议等处于OSI七层模型的顶层,应用层。
- HTTP协议:客户端与服务器80端口建立一个TCP连接,在这个链接的基础上进行请求和应答,以及数据的交换。HTTP的1.0和1.1主要区别在于:HTTP 1.0中每次请求都要新建立一个TCP协议,而HTTP 1.1开始,运行在一个TCP连接上发送多个命令和应答,因此大幅减少TCP连接的建立和断开,提高了资源利用率和效率。HTTP有八种请求。【POST,GET,PUT,HEAD,DELETE,OPTIONS,TRACE,CONNECT】
- POST和GETGET请求常用于查询、获取数据;POST请求则用于发送数据。
区别:
GET请求可以被缓存,可以被收藏为书签,但是POST不能;
GET请求会保留在浏览器的历史记录中,POST不会;
GET请求的长度有限制(主要是浏览器限制,HTTP协议中没有限制),URL的数据类型只能是ASCII,POST请求几乎没有限制。
GET请求的参数在URL中,因此绝不能用GET请求传输敏感的数据,POST请求数据相对安全性略高于GET,位于HTTP的请求头。
- Cookie和Session HTTP为无状态链接,为了持久保存一些信息,就需要使用Cookie和Session。两者的区别:
最大的区别:Cookie位于客户端,Session位于服务端。
由此可以得到更多的区别:
cookie安全性差,浏览器可以分析本地的Cookie来进行Cookie欺骗。
单个Cookie的大小有限制(4KB),每个站点cookie数量一般也有限制(20个)。
服务端可以接收客户端发过来的cookie,但是session不会被发送到客户端。
- 加密和解密对称加密和非对称加密RSA:非对称加密,两个很大的素数求积容易,分解难这一思想。
- HTTPSHTTP直接使用TCP协议,没有对数据加密,明文传输,有很大风险。
窃听
篡改
冒充
HTTPS协议旨在解决以上风险:
1.数据加密,无法窃听
2.校验机制,不能破坏
3.配置证书,不能伪装
证书应该由权威的证书机构(CA)发给申请者,如果证书虚假,或者自己颁发给自己的,服务器就会不认,发出警告。
总结
在面试中,我们一定会碰到网络中的问题,而且在实际的开发过程中,我们只有对网络底层更加了解,编起码来也更得心应手。