1、从输入网址到显示网页的过程分析(含挥手过程)?
1. URL解析
浏览器判断URL是否合法,如果合法会生成HTTP请求报文
2. DNS解析
DNS解析就是将域名转化为IP地址的过程。
- 查询本地缓存:包括浏览器DNS缓存->本地HOST文件和本地DNS缓存
- 本地DNS服务器:浏览器会发送一个DNS请求给本地DNS服务器,如果本地DNS服务器没有这条缓存,本地DNS服务器会向根域名发起查询请求。
- 根DNS服务器:根DNS服务器不保存具体域名和IP地址的缓存信息,而是判断该顶级域名是属于哪一个顶级域名服务器管理,该服务器的IP返回给本地DNS服务器。本地DNS服务器再向顶级域名服务器发起请求,顶级域名服务器收到请求后,如果无法解析,则会将负责二级域名的服务器IP地址返回给本地DNS服务器。本地DNS服务器再像二级域名服务器发起请求,重复上述过程,直到找到该域名对应的IP地址。
- 本地DNS服务器保存缓存信息。最后,本地DNS服务器不仅要把IP地址返回给用户电脑,还要把这个对应关系保存在缓存中,以备下次别的用户查询时,可以直接返回结果,加快网络访问。
3. 与目标主机建立连接(TCP三次握手)
- 第一次握手:客户端向服务端发送SYN请求,询问是否能够建立连接;
- 第二次握手:服务端接收SYN请求后向客户端发送ACK+SYN请求;
- 第三次握手:客户端发送ACK请求。
经过三次握手后,客户端和服务端建立连接,进入数据传输状态。
为什么是三次握手而不是两次握手?
为了防止已失效的请求报文突然又传到服务器引起错误(解决网络信道不可靠的问题)。如果是两次握手,服务端回复完SYN+ACK后即建立连接。可能存在的问题是客户端向服务端发的请求报文在网络中的某个节点堵塞,在一段时间未收到服务端返回的SYN+ACK,客户端会向服务端重新发送报文,服务端返回请求。如果此时第一次发送的报文突然恢复正常到达服务端,那么服务端会认为是客户端发起了一个新的连接,此时服务端认为是两个连接,客户端认为是一个连接状态不一致。而在三次握手的情况下,服务端收不到最后的ACK包,便不会认为建立连接。
4. 发送和接收数据
5. 与目标主机断开连接(四次挥手断开连接)
- 第一次挥手:客户端向服务端发送FIN包,进入FIN- WAIT-1状态。
- 第二次挥手:服务端接收到FIN包,向客户端发送ACK包,进入CLOSE-WAIT状态。服务端接收到ACK包,进入FIN-WAIT-2状态。
- 第三次挥手:服务端向客户端发送FIN包,进入LAST-ACK状态。
- 第四次挥手:客户端接收到FIN包,向服务端发送ACK包,进入TIME-WAIT状态,超过一定时间后自动关闭连接。服务端接收到ACK包后关闭连接。
超时等待的作用:本质上还是为了解决信道不可信的环境下,保证客户端和服务端可靠地断开链接。
客户端向服务端发送的ACK包服务端可能收不到,如果客户端立即关闭,那么客户端和服务端状态会不一致。超时等待的作用就是如果服务端没有接收到客户端返回的ACK包,那么会向客户端重新发送FIN包,客户端接收后就知道上一个ACK包未达,会重新发一个ACK包,并刷新超时时间。
为什么中间两次挥手不合并为一次?
服务端ACK包和FIN包不一起发送的原因是可能还存在未发送完的数据,所以先向客户端发送ACK包告诉客户端接收到关闭连接的请求,待发送完数据后再发送FIN包,因此是四次挥手。
2、HTTP和HTTPS的区别?
- HTTP的默认端口是80端口,HTTPS的默认端口是443端口。
- HTTP采用的是超文本传输协议,而HTTPS采用的是SSL加密传输协议。
- HTTP不需要到CA申请证书,HTTPS需要到CA申请证书。一般免费的证书较少,因此需要花费。
3、TCP和UDP的区别?
- TCP是面向连接的可靠传输方式,使用流量控制和拥塞机制;UDP是无连接的不可靠传输方式,不实用流量控制和拥塞机制。
- TCP只能一对一传输;UDP则支持一对一(单播)、一对多(多播、广播)、多对多。
- TCP传输的是是字节流;UDP传输的是报文。
- TCP头部开销20-60字节;UDP头部开销8字节。
- TCP适用于可靠传输的场景(文件传输);UDP适用于实时应用场景(直播、视频会议)。
什么是单播、多播(组播)和广播?
- 单播:在同一网络内,两个设备点对点的通信就是单播通信。
- 组播:在同一网络可达范围内,一个网络设备与关心其数据的部分设备进行通信就是组播。
- 广播:在同一网络可达范围内,一个网络设备向本网络内所有设备进行通信就是广播。
TCP面向字节流和UDP面向报文的区别?
面向字节流:TCP协议会将应用层传输来的数据放入缓冲区,当能够发送的时候才发送数据,同时会根据网络拥堵情况确定每个报文段的大小。
面向报文:UDP对于应用层传输来的数据不拆分不合并,在加上首部后直接发送,而接收方在接收到数据后去掉首部再传输给上面的应用层,因此需要应用层控制报文的大小。
4、TCP和UDP的适用场景?
- TCP适用于效率要求低,可靠性要求高的场景。如文件传输、远程登录和接收邮件。
- UDP适用于效率要求高,可靠性要求低的场景。如视频会议、语音电话、QQ聊天和广播通讯。
5、TCP如何保证可靠传输?
校验和、确认应答+序列号、流量控制、超时重传、拥塞控制。
- 校验和:发送方将发送的数据都转为16位的二进制数,然后将这些数加起来,超出的进位加到后面,最后取反得到校验和并进行填充;接收方接收到数据后同样进行检验和计算,然后和发送方的校验和进行对比。不一致则数据传输一定有误,但是一致也不能保证数据传输无误。
- 确认应答+序列号:TCP协议传输的是字节流,会对每个字节流进行编号。接收方每次接收到数据后会回复ACK包,ACK包中会告诉发送方下一个包的序列号(上一个包的序列号+数据长度)
- 流量控制:TCP协议中,发送方和接收方都有一个缓冲区,发送方只能发送接收方缓冲区能接收的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。
- 超时重传:发送方发送完数据后会等待接收方回复确认,但是有两种情况会收不到回复。1.接收方未接收到数据包;2.发送方未接收到ACK包。超时重传就是发送方如果没有在一定时间内接收到回复,会重新发送一个数据包,接收方接收到会再次向发送方回复。值得注意的是,如果接收方已经有这个数据包(判断方式为序列号),那么会丢弃这个数据包。
- 拥塞控制: 慢开始、拥塞避免、快重传、快恢复。
6、TCP如何控制传输速率?
TCP协议中,数据发送端和接收端都有一个滑动窗口(类似缓冲区),接收端每次回复ACK的时候会告诉发送端滑动窗口的大小,发送端收到后会调整连续发送数据的大小。其主要作用是告诉数据发送端数据接收端接收数据的能力,从而控制传输速率。