计算机网络面经(笔记二,续更)
传输层协议和网络层的区别
网络层协议负责提供主机间的逻辑通信;运输层协议负责提供进程间的逻辑通信。
子网掩码:用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。
UDP和TCP协议
// TCP 和 UDP -> 传输层的协议
UDP:用户数据报协议,面向无连接,可以单播,多播,广播, 面向数据报,不可靠
TCP:传输控制协议,面向连接的,可靠的,基于字节流,仅支持单播传输
UDP | TCP | |
---|---|---|
是否创建连接 | 无连接 | 面向连接 |
是否可靠 | 不可靠 | 可靠的 |
连接的对象个数 | 一对一、一对多、多对一、多对多 | 支持一对一 |
传输的方式 | 面向数据报 | 面向字节流 |
首部开销 | 8个字节 | 最少20个字节 |
适用场景 | 实时应用(视频会议,直播) | 可靠性高的应用(文件传输) |
TCP通信流程
服务器端 (被动接受连接的角色)
- 创建一个用于监听的套接字 - 监听:监听有客户端的连接 - 套接字:这个套接字其实就是一个文件描述符
- 将这个监听文件描述符和本地的IP和端口绑定(IP和端口就是服务器的地址信息) - 客户端连接服务器的时候使用的就是这个IP和端口
- 设置监听,监听的fd开始工作
- 阻塞等待,当有客户端发起连接,解除阻塞,接受客户端的连接,会得到一个和客户端通信的套接字 (fd)
- 通信 - 接收数据 - 发送数据
- 通信结束,断开连接
客户端
- 创建一个用于通信的套接字(fd)
- 连接服务器,需要指定连接的服务器的 IP 和 端口
- 连接成功了,客户端可以直接和服务器通信 - 接收数据 - 发送数据
- 通信结束,断开连接
TCP和UDP的区别
TCP有一个保活机制,用于服务端,用于检查已经建立TCP链接的客户端状态,区别:
- TCP(传输控制)是可靠的面向连接,UDP(用户数据)无连接,不可靠
- TCP以字节流的形式传输,传输效率慢,消耗资源多
- UDP以数据报文段形式传输,传输效率快,消耗资源少
- 首部字节也不一样,TCP的首部字节为20-60,后面4n个字节是根据需求增加而定
UDP的首部为8个字节,有源端口号,目的端口号,校验和,长度各2个字节
TCP三次握手,四次挥手
-
三次握手
第一次握手,客户端会向服务端发送SYN报文,SYN标志位为1的,请求服务端的端口打开,此时服务端知道客户端要和他建立新的连接,于是服务端就向客户端发送一个确认消息包ACK位置1,同时再向客户端发送一个SYN包,请求客户端的某个端口打开。以上两次握手之后,对于客户端而言,其实是已经知道了所有信息,就是我客户端既能给服务端发送消息,我还能收到服务端的消息;对于服务端而言,两次握手是不够的,因为到目前为止,服务端只知道一件事情,客户端给我发送的消息我收的到,但是我发给客户端的消息,客户端能不能收到我还不知道。
所以还要进行第三次握手。第三次握手就是当客户端收到服务端发过来的确认消息的报文之后,还要继续给服务端进行一个回应,
也是一个ACK标志位为1的一个确认消息。通过以上三次连接,不管是服务端还是客户端都彼此知道了,我既能给对方发送消息也能收到对方的消息,那么这个连接就能被安全的建立了。
(目的:确认双方消息正常收发) -
四次挥手
四次挥手机制,也是由客户端首先发起的,客户端向服务端发送FIN消息报文,表示终止客户端到服务端单方向的消息传输,当服务端收到这报文之后,我就知道了客户端想要和他断开连接,但是对于服务端而言它极有可能还有未发送完的的消息,它还要继续发送;所以此时对于服务端而言他只能进行一个消息确认,发完ACK消息确认包后,服务器继续把未发送完的消息发送。发送完毕后,再继续向客户端发送一个FIN报文,终止服务端到客户端这一方向的信息传输,此时服务端也已经做好了断开连接的准备,那么当这个报文发给客户端的时候,客户端同样要给服务端继续发送一个消息确认的ACK报文。
一共有四次,通过这四次的相互沟通和连接,我们知道了,不管是服务端还是客户端都已经做好了断开连接的准备,于是连接就可以被断开了。
具体讲讲三次握手
第一次握手:
1. 客户端将SYN标志位置为1
2. 生成一个随机的32位的序号seq=J , 这个序号后边是可以携带数据(数据的大小)
第二次握手:
1. 服务器端接收客户端的连接: ACK=1
2. 服务器会回发一个确认序号: ack=客户端的序号 + 数据长度 + SYN/FIN(按一个字节算)
3. 服务器端会向客户端发起连接请求: SYN=1
4. 服务器会生成一个随机序号:seq = K
第三次握手:
1. 客户单应答服务器的连接请求:ACK=1
2. 客户端回复收到了服务器端的数据:ack=服务端的序号 + 数据长度 + SYN/FIN(按一个字节算)
而四次挥手发生在断开连接的时候,在程序中当调用了close()会使用TCP协议进行四次挥手。
客户端和服务器端都可以主动发起断开连接,谁先调用close()谁就是发起。
因为在TCP连接的时候,采用三次握手建立的的连接是双向的,在断开的时候需要双向断开。
四次挥手后为啥要等待2MSL
主动断开连接的一方, 最后进入一个 TIME_WAIT状态, 这个状态会持续: 2msl
msl: 官方建议: 2分钟, 实际是30s
当 TCP 连接主动关闭方接收到被动关闭方发送的 FIN 和最终的 ACK 后,连接的主动关闭方必须处于TIME_WAIT 状态并持续2MSL 时间。 这样就能够让 TCP 连接的主动关闭方在它发送的 ACK 丢失的情况下重新发送最终的 ACK。
主动关闭方重新发送的最终ACK 并不是因为被动关闭方重传了 ACK(它们并不消耗序列号, 被动关闭方也不会重传),而是因为被动关闭方重传了它的FIN。事实上,被动关闭方总是重传 FIN 直到它收到一个最终的 ACK。
- 2MSL,可使被本次TCP连接的所有报文消失,不会出现在下一个连接
- 考虑丢包问题,第四次挥手发送的ACK报文丢失,服务端没收到会重发第三次挥手的报文,如果客户端发送第四次挥手的确认报文后直接关闭,报文又恰好丢失,会造成服务端无法正常关闭.
TIME_WAIT和CLOSE_WAIT的区别
TIME_WAIT
TIME_WAIT是主动关闭形成的,当第四次挥手完成,也就是客户端向服务端发送完ack消息确认报文后,客户端进入TIME_WAIT,等待2MSL
CLOSE_WAIT
CLOSE_WAIT是被动关闭形成的,当客户端发送FIN0-1报文,服务端返回ACK报文后,客户端进入CLOSE_WAIT
TCP滑动窗口
滑动窗口协议是用来改善吞吐量的一种技术,
即容许发送方在接收任何应答之前传送附加的包。
接收方告诉发送方在某一时刻能送多少包 (称窗口尺寸)。
滑动窗口是 TCP 中实现诸如 ACK 确认、流量控制、拥塞控制的承载结构。
TCP 中采用滑动窗口来进行传输控制,滑动窗口的大小意味着接收方还有多大的缓冲区可以用于 接收数据。发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据。
当滑动窗口为 0 时,发送方一般不能再发送数据报。
注:
接收方滑动窗口满了或者接收方回应的ack包丢失,会出现双方一直等待而出现死锁情况。这时就需要坚持计时器来辅助发送方周期性地向接收方查询,从TCP保活机制,定时器入手。
UDP为什么不可靠
UDP只有一个socket 接收缓冲区,没有socket发送缓冲区;即只要有数据就发,不管对方是否可以正确接收。而在对方的socket接收缓冲区满了之后,新来的数据报无法进入到socket 接受缓冲区,此数据报就会被丢弃,因此UDP 不能保证数据能够到达目的地,此外,UDP也没有流量控制和重传机制,故UDP的数据传输是不可靠的。
TCP如何保证可靠传输的
- 数据分块:应用数据被分割成TCP认为最适合发送的数据块。
- 序列号和确认应答:
TCP给发送的每一个包进行编号,在传输的过程中,每次接收方收到数据后,都会对传输方进行确认应答,即发送ACK报文,这个ACK报文当中带有对应的确认序列号,告诉发送方成功接收了哪些数据以及下一次的数据从哪里开始发。除此之外,接收方可以根据序列号对数据包进行排序,把有序数据传送给应用层,并丢弃重复的数据。 - 校验和
在发送端和接收端分别计算数据的校验和,若两者不一致,则说明数据在传输过程中出现了差错,TCP将丢弃和不确认此报文段 - 流量控制
TCP连接的双方都有一个固定大小的缓冲空间,发送方发送的数据量不能超过接收端缓冲区的大小。当接收方来不及处理发送方的数据,会提示发送方降低发送的速率,防止产生丢包。接收方返回的ACK中会包含自己的接收窗口大小,以控制发送方此次发送的数据量大小(发送窗口大小)。TCP通过滑动窗口协议来支持发送端的流量控制机制。 - 拥塞控制:当网络某个节点发生拥塞时,减少数据的发送。包括慢开始,拥塞避免,快重传,快恢复。
- 超时重传
当TCP发出一个报文段后,它启动一个定时器,等待目的端确认收到这个报文段。如果超过某个时间还没有收到确认,将重发这个报文段。
HTTP补充
谈谈HTTP/1 HTTP/2 HTTP/3的发展
- 技术的发展都是为了解决某些问题
- HTTP/1的问题是短链接每次都需要三握四挥、不安全(HTTPS)、无状态(Cookie)、服务端不能主动发送。(核心,1.0短连接 1.1可以长连接 不安全)
- HTTP/2默认了长连接(Keep-Alive)、引入TLS/SSL、Cookie、服务端主动发送、头部压缩、多路复用。但是还有队头阻塞的问题(因为虽然进行了长连接,但是还有一种情况会出现队头阻塞,那就是 丢失重传)。(核心 队头阻塞 SSL Cookie)
- HTTP/3使用UDP解决了丢失重传导致的队头阻塞,并且使用了TLS/SSL1.3减少了建立HTTPs连接的时间到1.5-2个RTT(往返时间),还引入了二进制编码,其他细节忘记了。
- 提前将资源推送到浏览器
- 推送可以基于已发送的请求,例如客户端请求 html,服务端可以主动推送 js、css 文件
如果你访问一个网站很慢,怎么排查和解决?
网页打开速度慢的原因有很多,这里列举出一些较常出现的问题:
- 首先最直接的方法是查看本地网络是否正常,可以通过网络测速软件例如电脑管家等对电脑进行测速,若网速正常,我们查看网络带宽是否被占用,例如当你正在下载电影时并且没有限速,是会影响你打开网页的速度的,这种情况往往是处理器内存小导致的;
- 当网速测试正常时,我们对网站服务器速度进行排查,通过ping命令查看链接到服务器的时间和丢包等情况,一个速度好的机房,首先丢包率不能超过1%,其次ping值要小,最后是ping值要稳定,如最大和最小差值过大说明路由不稳定。或者我们也可以查看同台服务器上其他网站的打开速度,看是否其他网站打开也慢。
- 如果网页打开的速度时快时慢,甚至有时候打不开,有可能是空间不稳定的原因。当确定是该问题时,就要找你的空间商解决或换空间商了,如果购买空间的话,可选择购买购买双线空间或多线空间;如果是在有的地方打开速度快,有的地方打开速度慢,那应该是网络线路的问题。电信线路用户访问放在联通服务器的网站,联通线路用户访问放在电信服务器上的网站,相对来说打开速度肯定是比较慢。
- 从网站本身找原因。网站的问题主要包括网站程序设计、网页设计结构和网页内容三个部分。