互联网面经笔记(三)- 计算机网络篇
- ******************************* 网络层 *******************************
- 一. ARP协议,描述一下原理
- ******************************* 传输层 *******************************
- 一. TCP和UDP对比
- 二. TCP三次握手
- 三. 滑动窗口
- 四. TCP的可靠性,超时重传怎么实现
- ******************************* 应用层 *******************************
- 一. HTTP和HTTPS
- 二. HTTPS加密过程
- 三. 非对称加密和对称加密算法
- 四. 输入一个URL,回车后直到渲染出页面中间发生了什么(dns是属于TCP还是UDP)
- 五. session和cookie的区别
- 六. get和post的区别
- 七. HTTP状态码
- 八. 代理服务器
- ******************************* Socket *******************************
- 一. TCP的TIME_WAIT 和CLOST_WAIT
- 二. time_wait 和close_wait,客户端断开连接了,服务器会怎样
******************************* 网络层 *******************************
一. ARP协议,描述一下原理
ARP协议是解决了同一局域网上主机或者路由器的IP地址和硬件地址之间的映射
- 源主机和目的主机在同一局域网
• 源主机先会查看自己的ARP高速缓存中是否有目的IP地址的MAC地址记录
• 如果源主机的高速缓存中有目的IP地址的记录,则直接通过这个MAC地址进行数据的传输
• 如果源主机的高速缓存中没有目的IP地址的记录,则会向局域网的所有主机广播一个ARP请求,寻找目的IP地址的MAC地址
• 当本网络的所有主机收到该ARP数据包时,首先检查数据包中的IP地址是否是自己的IP地址,如果不是,则忽略该数据包,如果是,则首先从数据包中取出源主机的IP和mac地址写入到ARP列表中,如果以存在,则覆盖然后将自己的mac地址写入arp响应包中,告诉源主机自己是它想要找的mac地址
• 源主机收到ARP响应包后,将目的主机的IP和mac地址写入ARP列表,并利用此信息发送数据 - 源主机和目的主机不在同一个局域网
• 源主机主机先通过广播一个ARP请求,找到本网络中的一个路由器的MAC地址,然后将数据包直接给路由器
• 当路由收到数据包后,如果目的IP地址在子网络中的话,这时通过ARP找到目的主机MAC地址,然后把数据包给目的主机。
• 如果目的主机不和源主机发送数据的路由器在同一网络内的话,则路由器会通过ARP协议找到下一跳的路由器,然后把数据包发送到该路由上,以此类推
******************************* 传输层 *******************************
一. TCP和UDP对比
- 连接
TCP是面向连接的传输层协议,即传输之前必须先建立连接
UDP是无连接,传输之前不需要建立连接 - 服务对象
TCP只能一对一服务
UDP支持一对一、一对多、多对一和多对多的服务 - 可靠性
TCP是可靠交付,无差错、不丢失、不重复
UDP是进最大努力交付 - 拥塞控制
TCP有拥塞控制保证数据传输安全性
UDP没有拥塞控制,网络拥塞不会影响主机发送效率 - 首部开销
TCP首部开销大,20个字节
UDP首部开销小,8个字节(源端口、目的端口、数据长度、校验和) - 应用场景
TCP:超文本传输协议
UDP:实时通信、视频通话
二. TCP三次握手
- 第一次握手:Client将标志位SYN置为1,随机产生一个序列号Seq = C,并将该数据包发送给Server,然后客户端进入SYN_SENT状态,等待服务器确认
- 第二次握手:服务器收到数据,由标志位SYN = 1得知客户端要建立连接,服务请将标志位SYN和ACK都置为1,然后Ack = C+1,并也随机产生一个序列号Seq = S,并将该数据包发送给客户端,然后服务器进入SYN_RCVD状态
- 第三次握手:客户端收到确认后,检查标志位ACK是否为1,Ack是否为C+1,如果正确将标志位ACK置1,Ack = S+1,并将该数据包发送给服务器,服务器收到后检查标志位ACK是否为1,Ack是否为S+1,如果正确则连接建立成功,客户端和服务端进入ESTABLISHED状态,三次握手完成
三. 滑动窗口
滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的分组的序号队列,称为发送窗口;同时,接收方也维持了一个连续的允许接收的分组的序号对列,称为接收窗口,接收窗口大小取决于应用、系统、硬件的限制,发送窗口则要求取决于对端通告的接收窗口大小,发送窗口内的序列号代表了那些已经被发送,但是还没有被确认的分组,以及可以被发送的分组,接受窗口内的序列号代表了允许接收的分组,该协议允许发送方在停止并等待接收确认报文前可以连续发送多个分组,也就是发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输。只有在接收窗口向前滑动时,也就是接收窗口收到了报文同时也发送了确认,发送窗口才有可能向前滑动。收发两端的窗口按照以上规律不断地向前滑动,因此这种协议又称为滑动窗口协议
四. TCP的可靠性,超时重传怎么实现
- 校验和
在发送数据之前计算检验和,并进行校验和的填充,计算方式为将发送的数据段都当做一个16位的整数,将这些整数加起来,并且前面的进位不能丢弃,补在后面,最后取反,得到校验和,接收方:收到数据后,对数据以同样的方式进行计算,求出校验和,与发送方的进行比对 - 序列号、确认应答、超时重传
数据到达接收方,接收方需要发出一个确认应答,表示已收到该数据,并且确认序号会说明它下一次需要接收的数据序列号,如果发送方迟迟未收到确认应答,那么可能是发送数据丢失,或者是确认应答丢失,这时发送方会等待一段时间进行重传,这个时间一般是2 * RTT(报文往返时间) - 滑动窗口
发送方和接受方各自维护了一个连续的允许发送的分组的窗口,窗口大小就是无需等待确认而可以继续发送数据的最大值,TCP利用窗口控制来提高传输速度,就是在一个窗口内不用等到应答才发送下一个数据,如果不使用窗口控制,每一个没收到确认应答的数据都要重发; - 流量控制
TCP首部中,专门有一个字段用来通知窗口大小。接收主机将自己可以接收数据的缓冲区大小放入这个字段中通知给发送端,于是发送端会发送不超过这个限度的数据。该大小限度就被称作窗口大小。也就是说,发送端主机会根据接收端主机的指示,对发送数据的量进行控制。当接收端缓冲区满,发送端停止发送数据,之后,在收到发送窗口非零后接收端向发送端发送通知后通信才得以继续进行。如果这个窗口的更新通知在传送途中丢失,可能会导致无法继续通信。为避免此类问题的发生,发送端主机会时不时的发送一个叫做窗口探测的数据段,此数据段仅含一个字节以获取最新的窗口大小信息 - 拥塞控制
慢启动:定义拥塞窗口cwnd,初始值为1,之后每次收到确认应答,拥塞窗口大小 *2
拥塞避免:设置慢启动门限ssthresh,刚开始设为65535,当拥塞窗口大小超过慢启动门限时,拥塞窗口大小cwnd不再指数上升,而是线性增加,当拥塞发生,产生超时重传时,这时慢启动门限ssthresh设置为cwnd/2,拥塞窗口大小cwnd重置为1,重新开始慢启动
快速重传:当发送端收到连续3个相同的ACK信号时,要在定时器超时之前重传数据,当连续收到3个应答信号,表明指示个别字段丢失,网络还没有那么拥堵
快速恢复:在 快速重传之后使用,这时慢启动门限ssthresh设置为cwnd/2,拥塞窗口大小cwnd设置为慢启动门限大小,然后线性增长
******************************* 应用层 *******************************
一. HTTP和HTTPS
- HTTP协议是以明文的方式在网络中传输数据,HTTPS协议传输的数据是经过TLS加密后的,HTTPS具有更高的安全性
- HTTPS在TCP三次握手后,还需要进行SSL握手阶段,才可以进入加密报文传输
- HTTPS协议需要服务器申请证书,来保证服务器是可信的
- HTTP协议端口是80,HTTPS协议端口是443
二. HTTPS加密过程
- 客户端向服务器发起通信请求,并且向服务器发送以下信息:
• 客户端支持的 SSL/TLS 协议版本,如 TLS 1.2 版本
• 客户端生产的随机数
• 客户端支持的密码套件列表,如 RSA 加密算法 - 服务器收到客户端请求后,向客户端发出响应,响应包含以下内容:
• 确认 SSL/ TLS 协议版本,如果浏览器不支持,则关闭加密通信
• 服务器生产的随机数
• 确认的密码套件,如 RSA 加密算法。
• 服务器的数字证书 - 客户端收到服务器的回应之后,首先确认服务器的数字证书的真实性,如果证书没有问题,客户端会从数字证书中取出服务器的公钥,然后使用它加密报文,向服务器发送如下信息:
• 一个随机数
• 加密通信算法改变通知,表示随后的信息都将用会话秘钥加密通信
• 客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时把之前所有内容的数据做个摘要,用来供服务端校验 - 服务器收到客户端的密文后,用自己的私钥进行解密,通过协商的加密算法结合三个随机数,计算出本次通信的会话秘钥。然后,向客户端发生最后的信息:
• 加密通信算法改变通知,表示随后的信息都将用会话秘钥加密通信
• 服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时把之前所有内容的数据做个摘要,用来供客户端校验
三. 非对称加密和对称加密算法
- 对称加密
对称加密指的就是加密和解密使用同一个秘钥,所以叫做对称加密。对称加密只有一个秘钥,作为私钥,常见的对称加密算法:DES,AES,3DES等 - 非对称加密
非对称加密指的是加密和解密使用不同的秘钥,一把作为公开的公钥,另一把作为私钥。公钥加密的信息,只有私钥才能解密。私钥加密的信息,只有公钥才能解密,常见的非对称加密算法:RSA,ECC - 区别
对称加密算法相比非对称加密算法来说,加解密的效率要高得多。但是缺陷在于对于密钥的管理上,以及在非安全信道中通讯时,密钥交换的安全性不能保障。所以在实际的网络环境中,会将两者混合使用
四. 输入一个URL,回车后直到渲染出页面中间发生了什么(dns是属于TCP还是UDP)
- 浏览器要将URL解析为IP地址(此处用到DNS协议,属于UDP)
- 浏览器与目标服务器建立TCP连接
- 浏览器通过http协议,发起http-get报文请求,请求头中包含我们希望对请求文件的操作的信息,请求体中包含传递给后台的参数
- 服务器收到http请求后,后台进行处理,生成响应数据包,响应也包含两部分,响应头和相应体,响应体就是我们所请求的文件
- 经过网络传输,浏览器收到服务器响应数据包,浏览器开始渲染
五. session和cookie的区别
- 数据存储位置
cookie数据存放在客户的浏览器上,session数据放在服务器上 - 安全性
cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session - 服务器性能
session会在一定时间内保存在服务器上,当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie - 数据大小
单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie,session大小取决于服务器,但比cookie大
六. get和post的区别
在应用过程中可能会有所不同
- GET方法用于信息获取,不会修改服务器资源,是安全和幂等的,POST方法因为有可能修改服务器上的资源,所以它是不符合安全和幂等性的
- GET 方法只发送一个 TCP 数据包,POST 方法会产生两个 TCP 数据包,浏览器会先将请求头发送给服务器,待服务器响应100 continue,浏览器再发送请求数据,服务器响应200ok(返回数据)。这么看起来 GET 请求的传输会比 POST 快上一些,但是实际上在网络良好的情况下它们的传输速度基本相同
- POST 是将请求信息放置在请求数据中的,GET 请求的请求信息是放置在 URL中
七. HTTP状态码
- 1xx:指示信息,表示请求已接收,继续处理
- 2xx:成功,表示请求已被成功接收
- 3xx:重定向,要完成请求进行更进一步操作
- 4xx:客户端错误,请求有语法错误或请求无法实现
- 5xx:服务器端错误,服务器未能实现合法的请求
详解点击传送门
八. 代理服务器
代理服务器把最近的一些请求和响应暂存在本地磁盘中。当新请求到达时,若代理服务器发现这个请求与暂时存放的请求相同,就返回暂存的响应,而不需要按URL的地址再次去互联网访问该资源,使得网络通信量大大减少,因而减小了访问互联网的时延
以校园网为例,描述代理服务器工作流程:
- 校园网的计算机中的浏览器向互联网的服务器请求服务时,就先和校园网的代理服务器建立TCP连
- 若代理服务器已经存放了所请求的对象,代理服务器就把这个对象放入HTTP响应报文中返回给计算机的浏览器
- 否则,代理服务器就代表发出请求的用户浏览器,与互联网上的源点服务器建立TCP连接,并发送HTTP请求报文
- 源点服务器把所请求的对象放在HTTP响应报文中返回给校园网的代理服务器
- 代理服务器收到这个对象后,先复制在自己的本地存储器中(留待以后用),然后再把这个对象放在HTTP响应报文中,通过已建立的TCP连接返回给请求的浏览器
******************************* Socket *******************************
一. TCP的TIME_WAIT 和CLOST_WAIT
- TIME_WAIT
TIME_WAIT状态是主动关闭的一方在发送最后一个ACK之后会进入TIME_WAIT的状态,也就说该发送方会保持2MSL时间之后才会回到初始状态,这个状态是确保被动关闭一方能正常关闭,并且使本次连接产生的报文在网络中消失,过多的 TIME-WAIT 状态不仅占用内存资源,还占用着端口的资源,可通过以下两个方式优化:
• 复用处于 TIME_WAIT 的 socket 为新的连接所用,同时需要打开对 TCP 时间戳的支持
• 设置上限,当系统中处于 TIME_WAIT 的连接一旦超过这个值时,系统就会将所有的 TIME_WAIT 连接状态重置 - CLOSE_WAIT
CLOSE_WAIT状态是被动关闭的一方在向主动关闭一方FIN报文发送ACK报文后但还没有发送自己的FIN报文时的状态,CLOSE_WAIT状态设置上可以保持很长时间,但实际使用时时间很短暂,因此当出现这种状态一般是被动关闭一方程序出了差错
二. time_wait 和close_wait,客户端断开连接了,服务器会怎样
TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接