关于网络的一些常见问题

147 阅读3分钟

「这是我参与2022首次更文挑战的第27天,活动详情查看:2022首次更文挑战」。

浏览器输入url到页面展示发生了什么

首先会进行域名的DNS解析,解析成ip地址,之后会进行TCP的三次握手,然后再进行TCP的封包,IP封包,数据链路层的帧封包,通过物理层发出去,然后服务器再进行一系列的帧拆包,IP拆包,TCP拆包接受到数据之后,再同样的给发送方发送数据,就到页面展示,浏览器会异步加载js文件,加载静态文件,然后再形成一棵树,并且将这个树进行渲染,并进行绘画,然后呈现出来。

TCP的三次握手和四次挥手

三次握手

服务端进行监听状态,发送方发送SYN和seq请求服务端连接,服务端收到请求后返回给发送方ACK=1,并且确认号等于序列号+1,也就是ack=seq+1,新的序列号seq=y。服务端收到请求之后,连接就开始了。

四次挥手

发送方发送了一个FIN信号给服务端,服务端返回一个ACK确认关闭,然后关闭连接之后给服务端再发送已经关闭的请求,等待2MSL,获取到接受方的确认关闭之后,服务端就可以关闭连接了。

为什么四次挥手会有一个2MSL的等待。

因为要等待发送方时候会再次发送关闭确认包,也就是确保发送方发送的确定关闭是否丢包。还有一个原因是让网络的关于这次连接的包都失效

TCP不是可靠传输吗?为什么会丢包?

tcp提供的也仅仅是理论可靠的传输机制而已,从机制上讲,tcp是可靠的。所谓的丢包,是一种网络行为,与tcp无关,但tcp机制可以重传丢掉的网络包,起到了修正错误的目的 所以,丢包与tcp的所谓可靠性并不矛盾。

TCP流量控制和拥塞控制

首先要明确流量控制和拥塞控制的区别,这两个是不一样的。流量控制是确保接收方能收到,拥塞控制是控制整个网络的顺畅程度。

流量控制

TCP中有滑动窗口来进行流量控制,接收方和发送方都有一个滑动窗口来控制收发的顺序。

拥塞控制

如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞程度更高。因此当出现拥塞时,应当控制发送方的速率。这一点和流量控制很像,但是出发点不同。流量控制是为了让接收方能来得及接收,而拥塞控制是为了降低整个网络的拥塞程度。

拥塞控制的方法有四个慢开始、拥塞避免、快重传、快恢复

TCP 粘包是什么情况

TCP是基于面向流传输的,但是我们一般会把我们的数据分成一个一个的包,这也是我们TCP会丢包的情况,并且粘包的原因有很多种情况,可能是发送方,可能是接受方。

  1. 发送方没有即时发送包,以导致两个包一起发送。
  2. 接收方没及时处理数据包,导致缓冲区的两个包合起来了。

如何解决TCP粘包

  1. 两次发送之间sleep,但是这种缺点显而易见

  2. 进行封包,防止粘连在一起,定义结构体成员变量表示包体的长度,和包一起发送