、TCP和UDP的区别
TCP:传输控制协议,是一种面向连接、传输可靠、基于字节流的运输层通信协议。
UDP:用户数据报协议,无连接、传输不可靠、数据报文段。
TCP | UDP | |
可靠性 | 可靠 | 不可靠 |
是否连接 | 面向连接 | 无连接 |
报文格式 | 字节流 | 面向报文段 |
传输方式 | 全双工 | 一对一、一对多、多对一、多对多 |
效率 | 效率低 | 效率高 |
流量控制 | 滑动窗口 | 无 |
拥塞控制 | 慢启动、拥塞避免、快重传、快恢复 | 无 |
场景 | 准确性高,有连接要求的场景 | 效率要求高、准确率要求低 |
二、OSI七层参考模型
OSI七层:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
TCP/IP四层:数据链路层、网际层、传输层、应用层
三、从输入URL到页面展示到底发生了什么?
①浏览器接受到用户请求,首先查看浏览器缓存,如果有直接返回;如果没有进入网络请求。
②网络请求前,进行DNS解析以获取域名的ip地址,DNS解析会按照浏览器缓存、本地host文件、路由器缓存、DNS服务器、DNS根服务器的顺序查找ip
DNS询问顺序:先问根服务器在哪个顶级域,再问顶级域服务器在哪个权威域,一层层询问直到找到。
③浏览器与服务器建立TCP连接,浏览器构建请求消息,包括请求行、请求头、请求体等信息。服务器收到请求消息后,生成响应数据。
④浏览器解析响应头,响应头的状态码为301、302,会重定向到新地址;若响应数据是字节流会提交给下载服务器;若是HTML类型,会进入下一步渲染流程。
⑤浏览器解析html文件,创建DOM树(文档对象模型,将文档作为一个树形结构,树的每个结点表示了一个HTML标签或标签内的文本项。DOM树结构精确地描述了HTML文档中标签间的相互关联性。),解析CSS(是种格式化网页的标准方式, 用于控制设置网页的样式,并且允许CSS样式信息与网页内容(由HTML语言定义)分离的一种技术)进行样试计算,将CSS和DOM合并,构建渲染树;最后布局和绘制渲染树,完成页面展示。
四、三次握手过程,为什么是三次,不是两次、四次?
TCP三次握手:①客户端和服务端都是关闭状态,服务端监听,客户端发送SYN报文,并初始化序列号(seq=x),客户端进入SYN_SEND状态。
②服务端收到SYN报文后,发送ACK报文(ack=x+1)确认自己已收到客户端的SYN报文,同时发送一个SYN报文,带上自己初始化序列号(syn=y),服务端进入SYN_RECV状态。
③客户端收到SYN和ACK报文后,发送一个ACK报文(ack = y+1)确认服务端的SYN报文,更新自己的序列号(seq=x+1)然后服务端和客户端都进入ESTABLISHED状态。
两次和四次:两次握手导致服务端每收到一个SYN就建立一个连接,没有足够的上下文判断历史连接,并且会导致资源的浪费。三次握手就可以建立一个连接,四次握手可以优化为三次。
五、三次握手是否携带数据?
第三次握手可以携带数据,第一次和第二次不能携带数据,因为第一次第二次连接还没建立起来,服务器处于不安全的状态,如果有恶意攻击服务器,每次都在第一次握手中放入大量数据,并且频繁重复发SYN报文,服务器会花费很多的时间和内存空间去接受这些报文,三次握手对于客户端来说服务已经建立,知道服务器接受和发送能力正常,可以携带数据。
六、四次挥手,为什么是四次?
四次挥手:①客户端首先发送一个FIN报文给服务端并初始化序列号(seq = u),表示自己要断开数据连接,然后进入FIN-WAIT状态。
②服务端收到FIN报文后,回复ACK报文(ack=u+1)给客户端,并初始化序列号(seq =v)然后服务端进入CLOSE-WAIT状态,客户端进入FIN-WAIT2状态。
③服务端处理完数据后,要断开连接时发送FIN报文并指定序列号(seq=w),然后服务端进入LAST-ACK状态。
④客户端收到FIN报文时,发出ACK报文(w+1)进行应答,并更新序列号,客户端进入TIME-WAIT状态,服务端在收到ACK后,进入CLOSED状态,如果客户端等待2MSL(报文最大生存时间,RFC 793规定是2分钟,一设置成30秒)生存时间没收到回复,才断开连接。
为什么四次:TCP是全双工通信,可以双向传输数据,在一方数据传输结束后发出释放连接的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放的通知,待对方确认后完全关闭。两次握手可以释放一端到另一端,但是不能保证另一端还有数据要处理发送,所以释放两端的连接需要四次挥手。