问题 回答
TCP如何建立链接 通过三次握手来建立连接。
- 客户端发送请求连接【SYN,seq=x】
- 服务器回发【SYN,ACK;ack=x+1,seq=y】
- 客户端发送【ACK;ack=y+1,seq=x+1】
TCP如何关闭链接 四次挥手
- 客户端发送【FIN,ACK;ack=z,seq=x】
- 服务器回发【ACK;ack=x+1,seq=z+1】
- 服务器关闭连接【FIN,ACK;ack=x+1,seq=n】
- 客户端进入TIME_WAIT阶段【ACK;ack=n+1】
- 客户端等待服务器是否重发FIN
TCP保活机制
一种在不影响数据流内容的情况下探测对方的方式,通过保活计时器实现。当计时器被激发,一端将发送一保活探测报文,另一端回复ACK。
默认规格
- 保活时间(7200s)
- 保活间隔(75s)
- 保活探测数(9次)

image.png
| 机制
在一段时间内(keepalive time)处于非活动状态时,开启保活的一端将向对方发送保活报文,若该端未收到
ACK,经过一个
保活时间间隔(keepalive interval),再次发送保活报文直到到达保活探测数(keepalive probe),认为对方主机不可达,连接中断(注意:此处可能因为短暂断网而导致连接误断开~!)
报文
空报文段或1字节(总共40或41字节),Seq=对端最大ACK-1(因该数据段序列号已被成功接受,故不会对数据流造成影响,接受方收到该报文后,认为其为之前丢失的报文,不作操作)
结果:发送段可察觉接收端如下状态
1. 对方主机仍在工作(正常返回ACK)
1. 对方主机崩溃(超过保活探测数,连接断开)
1. 客户主机崩溃并重启(返回reset报文段)
1. 对方主机仍在工作(网络原因未收到ACK)
| | 心跳检测(应用层)
- 应用层实现:在一个Timer事件中定时,向客户端 发送一个心跳检测包,然后启动一个低级别的线程,该线程不断检测客户端的响应,一段时间后未收到回应,判定客户端掉线
- 传输层事件:借助KeepAlive保活机制,默认在规定时间内会发送心跳检测包
| TCP保活和应用层心跳检测区别:
1. 应用层心跳检测包耗费更多带宽,可携带数据
1. TCP心跳检测包数据长度0,对应用层透明,不可携带数据。
| |
什么是滑动窗口 |
- 用于流量控制
- 发送滑动窗口和接收滑动窗口
- 第一次发送数据的窗口大小由
【链路带宽】决定
-
数据重发:由于捎带确认,即使确认应答包丢失,也不用重传确认应答包
-
三次重复ACK:通知发送端立即重发数据包
- 发送窗口:
- 最左边的数据收到确认后,则向右滑
- 接收窗口:
- 最左侧数据被取出后,右滑
| |
什么是拥塞控制
计算机网络 - 图2 | 对网络中某一资源(带宽,缓存等)的需求超过了该资源所能提供的可用部分,网络性能就会变坏
- 拥塞控制算法
- 慢开始:cwnd以2倍增长知道ssthresh
- 拥塞避免:每轮线性加一
- 快重传 : 三次ACK,提高整体网络吞吐量!
计算机网络 - 图3
- 快恢复
计算机网络 - 图4
- 发送方维护拥塞窗口变量cwnd
- 只要没有出现拥塞,则cwnd增大,若出现拥塞,则减小
- 发送方将拥塞窗口设置为发送窗口,即【swnd=cwnd】
- 维护一个慢开始门限ssthresh
- cwnd - cwnd=sthresh时,改用拥塞避免
- cwnd=sthresh,慢开始或拥塞避免
- 判断网络拥塞的依据:没有按时收到应当到达的确认报文
| | 什么是半关闭 | TCP连接只有一方发送了FIN,另一方没有发出FIN包,仍然可以在一个方向上正常发送数据。 | | 局域网内两台机器如何利用TCP/IP通信(同一网段)计算机网络 - 图5 |
- 主机A查看ARP缓存,查找主机B的IP到MAC的映射是否存在
- 是
- 构造报文,源IP和源MAC为主机A,目的IP和目的MAC为主机B
- 报文发送到交换机C,交换机C进行MAC地址表学习,将主机A的MAC和端口记录下来。
- 交换机C查找是否有主机B的MAC和端口
- 有:直接转发
- 无:泛洪的方式广播报文,主机B收到报文后向主机A回复,交换机则进行MAC表学习
- 否(多了ARP请求和回复的步骤,其余同上)
- 主机A发送ARP请求,并发送给交换机C,交换机采取泛洪的方式发送广播报文
- 主机B收到ARP请求,将主机A的IP到MAC映射写入ARP缓存,并将自身MAC封装到ARP回复报文
- 主机B将ARP回复报文单播给主机A。
- 同上
| | internet上两台主机如何进行通信(不同网段)
计算机网络 - 图6 |
- 主机A查看自己的ARP缓存表,检查是否有路由器E(网关)的IP到MAC的映射
- 有映射,获取路由器E的MAC,构造报文,目的IP为主机B的IP,源IP为主机A的IP,目的MAC为路由器E的MAC,源MAC为主机A的MAC,将报文通过交换机C发往路由器E,过程同上。
- 没有路由器E的IP到MAC的映射,需要发送ARP请求,获取路由器E的MAC。
- 路由器E收到主机A的报文后,剥离报文的MAC帧头,查询路由表,发现主机B的网络是直连
- 查看ARP缓存表,
- 有主机B的IP到MAC的映射关系,获取主机B的MAC,封装报文MAC帧头,目的MAC为主机B的MAC,源MAC为路由器E的MAC,将报文通过交换机D发往主机B,
- 没有主机B的IP到MAC的映射关系,需要发送ARP请求,获取主机B的MAC,过程同上。
| |
如何在internet上识别唯一一个进程 | 通过“IP地址+端口号”来区分不同的服务 | | 为什么说TCP是可靠的链接,UDP不可靠 | TCP:确认和重传机制、数据排序、流量控制、拥塞控制
UDP:无需连接(没有握手),没有重传,不需要维持双方在线 | |
路由器和交换机的区别
image.png |
- 工作
- 路由器:寻址,转发(依靠 IP 地址)
- 交换机:过滤,转发(依靠 MAC 地址)
我们可以看出这两者的主要工作就是转发数据,但是不同之处是,依靠的地址不同,这是一个根本区别!
- 路由器内有一份路由表,里面有它的寻址信息(就像是一张地图),它收到网络层的数据报后,会根据路由表和选路算法将数据报转发到下一站(可能是路由器、交换机、目的主机)
- 交换机内有一张MAC表,里面存放着和它相连的所有设备的MAC地址,它会根据收到的数据帧的首部信息内的目的MAC地址在自己的表中查找,如果有就转发,如果没有就放弃
每一个路由器与其之下连接的设备,其实构成一个局域网
交换机工作在路由器之下,就是也就是
交换机工作在局域网内
交换机用于
局域网内网的数据转发
路由器用于
连接局域网和外网 | | 点到点,端到端? | 端到端是由无数的点到点实现和组成的。
点到点是物理拓扑,如光纤,就必须是点到点连接DDN专线也是,即两头各一个机器中间不能有机器。
点到点是网络层的,你传输层只认为我的数据是从a直接到e的,但实际不是这样的,打个比方,传输层好象领导,他发布命令:要干什么什么事,但真正干的不是他,真正干的是员工,也许领导认为很简单一句话就可以干好的事,在员工眼里却是难于登天,手续极其烦琐,所以传输层是发布命令的领导,他说的是命令,也就是最终的目的,所以他只看到最初的地址和最终的地址,既一个任务的两个端点,网络层就相当于员工,领导的任务我要一步一步的作完,先从a到b,在从b到c…,所以他看到的只是整个任务的一个阶段,a到b,b到c…这就是点到点。
端到端是网络连接(传输层)。网络要通信,必须建立连接,不管有多远,中间有多少机器,都必须在两头(源和目的)间建立连接,一旦连接建立起来,就说已经是端到端连接了,即端到端是逻辑链路,这条路可能经过了很复杂的物理路线,但两端主机不管,只认为是有两端的连接,而且一旦通信完成,这个连接就释放了,物理线路可能又被别的应用用来建立连接了。tcp就是用来建立这种端到端连接的一个具体协议,spx也是。
端到端是传输层的,你比如你要将数据从a传送到e,中间可能经过a->b->c->d->e,对于传输层来说他并不知道b,c,d的存在,他只认为我的报文数据是从a直接到e的,这就叫做端到端。 | |
DNS
计算机网络 - 图8 |
-
DNS解析流程:以www.baidu.com为例
1. 浏览器检查是否有缓存(即域名对应的IP地址)
1. 操作系统检查是否有缓存
1. 请求本地域名服务器(LDNS),大约80%的域名解析到此为止
1. 若LDNS未命中,向RDNS(根域名服务器)请求解析,
1. RDNS向LDNS返回(LDNS查询域的主域名服务器gTLD,如.com,.cn,.org)
1. LDNS将解析请求转给gTLD服务器
1. gTLD查找对应域名的Name Server服务器地址(即网站注册的域名服务器)
1. LDNS将解析请求转给NameServer服务器,NameServer根据关系映射表查找到对应IP
1. NameServer将IP地址返回LDNS
1. LDNS将【域名-IP】存入缓存,并将对应IP地址返回终端。
-
DNS劫持:拦截域名解析请求,以实现对特定网络不能访问或假网址。
- 如何实现:DNS服务器做手脚;或伪造DNS服务器

| |
CDN**
CDN是建立并覆盖在承载网之上,由分布在不同区域的边缘节点服务器群组成的分布式网络。
4. 域名解析请求发送到阿里云DNS调度系统,分配最佳节点的IP地址
特点:
- CDN加速资源和域名绑定
- 通过域名访问资源,首先通过DNS调度系统查找离用户最近的CDN节点(边缘服务器)的IP
- 通过IP访问实际资源,若CDN上无缓存资源,则会请求源站,并缓存到CDN中
| image.png | | | |

HTTP/HTTPS

  1. 怎么保证保证服务器给客户端下发的公钥是真正的公钥,而不是中间人伪造的公钥呢?

答:

  • 通过CA机构给网站签发的数字证书
  • 流程:
    • 网站将公钥交给CA,CA附加上其他信息【网站域名,有效时常等】,以私钥加密后签发给网站
    • 将加密证书配置到网站即可
    • 客户端访问网站,会收到该加密公钥,通过CA公钥解密即可得到【非对称加密的公钥】
    • 客户端用【非对称加密公钥】加密【对称秘钥】,并发送给网站即可。
  • 若是证书在传输过程中被篡改(因为CA公钥公开),则该证书必须用【CA私钥】加密,才能保证接收端可以解密。