网络的七层和五层

OSI七层模型及协议

  • 应用层(HTTP/FTP/TFTP/SMTP/SNMP/DNS/TELNET/HTTPS/POP3/DHCP)
  • 表示层(JPEG/ASCII/EBCDIC/加密格式)
  • 会话层
  • 传输层(TCP/UDP)
  • 网络层(ICMP/IGMP/IPv4/IPv6)
  • 数据链路层
  • 物理层

    五层模型

  • 应用层

  • 传输层
  • 网络层
  • 数据链路层
  • 物理层

    TCP/IP概念模型(四层)

  • 应用层

  • 传输层
  • 网络层
  • 链路层

    面试题

    从浏览器输入URL到页面解析的全过程

  • 输入网址

输入URL

  • 缓存解析

浏览器获取URL后,先去缓存中查找资源,如果有就从缓存中显示界面,不再发送请求;如果没有,查询系统的host文件,如果查找到域名对应的ip信息,则直接使用,否则发送http请求。

  • 域名解析

在发送http请求之前,需要进行DNS域名解析(域名解析)(应用层):浏览器发送DNS请求到本地域名服务器,如果本地域名服务器的缓存中有该域名信息,则直接返回,否则本地域名服务器向根域名服务器发起请求,根域名服务器没有记载具体的域名和IP对应的关系,而是返回具有该域名信息的域名服务器,本地域名服务器向该域名服务器查询,将查询到的信息返回浏览器。

  • TCP连接,三次握手

在域名解析后,浏览器向服务器发起了http请求,建立tcp连接(传输层);因为tcp协议是面向连接的,所以在传输数据前必须建立连接,即三次握手;tcp连接建立后,浏览器开始向服务器发送http请求,请求数据包,请求信息包含一个头部和一个请求体。

  • 服务器响应

服务器收到浏览器发送的请求信息,返回一个响应头和一个响应体。

  • 页面渲染

浏览器收到服务器发送的响应头和响应体,进行客户端渲染。

TCP与UDP(传输层)

区别与总结

  • TCP向上层提供面向连接的可靠服务 ,UDP向上层提供无连接不可靠服务。
  • 虽然 UDP 并没有 TCP 传输来的准确,但是也能在很多实时性要求高的地方有所作为
  • 对数据准确性要求高,速度可以相对较慢的,可以选用TCP

image.png

TCP的连接方式

三次握手(建立连接)

  • A向B发送含有同步序列号的标志位的数据段,序号为x,请求连接
  • B收到A请求后,返回一个带有确认应答和同步序列号的数据段,序号为y,并告知A下次期望收到序号为x+1的数据段
  • A收到B回应后,再发送一个确认应答的数据段,序号为x+1,并告知B下次期望收到序号为y+1的数据段,建立连接成功

image.png

四次挥手(断开连接)

  • A完成数据传输后,向B发送序号为u的释放连接请求
  • B收到A请求后,返回序号为v的确认请求,并期望收到序号为u+1的数据段,此时A到B方向的连接就释放了,但B到B方向的连接还没有断开,因此B还能向A发送数据
  • B完成数据传输后,向A发送序号为w的释放连接请求,并期望收到序号为u+1的数据段
  • A收到B的请求后,返回序号为u+1的确认请求,B到A的连接断开

image.png

常见面试题

为什么是三次握手?不是两次、四次?

  • 三次握手才可以阻止重复历史连接的初始化(主要原因)
    • 如果是两次握手连接,就不能判断当前连接是否是历史连接,三次握手则可以在客户端(发送方)准备发送第三次报文时,客户端因有足够的上下文来判断当前连接是否是历史连接:
    • 如果是历史连接(序列号过期或超时),则第三次握手发送的报文是 RST 报文,以此中止历史连接;
    • 如果不是历史连接,则第三次发送的报文是 ACK 报文,通信双方就会成功建立连接;
  • 三次握手才可以同步双方的初始序列号
  • 三次握手才可以避免资源浪费

    为什么连接的时候是三次握手,关闭的时候却是四次握手?

    连接是一次建立,断开是双向断开
    因为当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当服务端收到客户端的FIN断开连接报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端,”你发的FIN报文我收到了”。只有等到服务端所有的报文都发送完了,服务端才能发送FIN报文,因此不能一起发送,故需要四步握手。

    为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

    虽然四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。在客户端发送出最后的ACK回复,但该ACK可能丢失。服务端如果没有收到ACK,将不断重复发送FIN片段。所以客户端不能立即关闭,它必须确认服务端接收到了该ACK。客户端会在发送出ACK之后进入到TIME_WAIT状态。客户端会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么客户端会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,客户端都没有再次收到FIN,那么客户端推断ACK已经被成功接收,则结束TCP连接。

    如果已经建立了连接,但是客户端突然出现故障了怎么办?

    TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。