网站首页 • 包含标签 网络 的所有文章
-
对线面试官 – TCP_IP四层网络模型经典连环问
面试官:TCP、IP四层模型有了解吗?可以简单说说嘛。 不念:主要包括数据链路层、网络层、传输层、应用层。 面试官:可以简单聊聊什么是OSI七层网络模型吗? 不念:可以的,其实它和四层网络模型主要区别是多了表示层、会话层、物理层,依次顺序是应用层``表示层、会话层、传输层、网络层、数据链路层、物理层 面试官:可以简单聊一聊各个层不同的含义,存在的意义吗? 不念:当然:首先来说:从底向上的4层模型: 物理层:所谓的物理层就是指将各个电脑直接通过某种介质(WiFi、网线)连接起来形成一个网络,这就是物理层的含义。物理层负责传输0和1的电路信号。 数据链路层:架构在物理层之上,定义一些协议,将电路信号0和1进行分组。后来统一固定为以太网协议,一组电信号就是一个数据包又叫一个帧,每帧分成两个部分,标头(head)和数据(data),标头会包含一些说明性的东西,比如发送者接收者和数据类型等等。 数据链路层:网络交换机就是工作在该层的。网络交换机是通过MAC地址来寻址和传输数据包的;但是路由器/网关是通过IP地址寻址和传输数据包的。网络交换机主要用在局域网的通信。一般你假设一个局域网,里面的电脑通过数据链路层发送数据包,通过MAC地址来广播的,广播的时候就是通过网络交换机这个设备来吧数据广播到局域网内的其它机器上去的。路由器一般用来让你接入英特网。 这里涉及到了以太网协议,它规定了只要接入网络的设备都必须要有一个网卡,以太网规定了,每个网卡必须包含一个Mac地址,Mac地址是这个网卡的唯一标识,唯一的Mac地址是一个48位的二进制,但是一般为了方便使用12个16进制数据表示,前6个事厂商编号,后6个16进制是网卡流水号。然后通过广播的方式在同一个子网内进行传播。 网络层:上面说通过广播的方式将数据包在同一个子网内传播出去,那么是确定是同一个子网、局域网呢?那这个时候就需要网络层。 在网络层中最重要的就是IP协议,IP协议可以给每个电脑定义一个IP地址(IPV4、IPV6),范围是0.0.0.0~255.255.255.255,这里的IP地址中前24个二进制位(也就是前3组十进制的数据)中表示的是网络,后8位(最后一组十进制)代表了主机。运算公式为:通过将两个IP地址的二进制与子网掩码的二进制进行与运算,并判断前面的3部分二进制是否一样,一样则是一个子网。否则不是一个子网/局域网 传输层:这里有个问题是。一台机器上很多程序使用的都是一个网卡进行通信的。这些软件都是从一个网卡往外面发送数据,完后并从该网卡接收数据。如何区分不同应用软件接收的不同数据呢,此时就需要引入一个端口(范围是0~65536、0~1023被系统占用了)的概念。从上面说的我们可以发现网络层是基于IP协议进行主机间的寻址和通信的,传输层则是建立在主机的某个端口上到另外主机的某个端口上完成连接和通信的这个通信是通过socket来实现的。通过socket就可以基于tcp/ip协议完成上述所说的基于IP地址和MAC地址转换和寻址。以及通过路由进行通信然后建立一个端口到另外一个端口的连接。 TCP/UDP都是传输层的协议,作用就是在数据包里面加入端口号,可以通过端口号进行点对点通信。UDP是不可靠的。TCP是可靠的。 应用层:通过TCP协议可以完成端口对端口的一个通信,但是通信成功后拿到的这个数据应该如何去处理,这里就涉及到了应用层。比如最常见的应用层协议就是http协议(按照什么格式封装的就需要按照什么格式去解析响应。)。进行网络通信。 不念:总结,其实最常见的就是四层网络协议,分别是:数据链路层(以太网协议)、网络层(IP协议)、传输层(TCP协议)、应用层(http协议)所谓的七层就是引入了物理层(网线、光缆)、会话层、表示层、应用层 这三层一个并也就是四层里的应用层了 面试官:不错不错,那你知道如果不在一个子网数据应该如何传播的吗? 不念:当然知道啦,不过这次有点累了,下次吧。 ...
-
对线面试官 – TCP经典面试题之三次握手
面试官:TCP三次握手和四次挥手的工作流程是什么? 不念:首先说一下TCP三次握手。 第一次握手,客户端发送链接请求报文,此时SYN=1、ACK=0、seq=x,这就是个连接请求此时客户端处于SYN_SENT状态,等待服务器响应。 第二次握手,服务端收到SYN=1的请求报文后需要返回一个确认的报文,ack=x+1,SYN=1,ACK=1,seq=y,发送给客户端,自己处于一个SYN_RECV的状态。 第三次握手,客户端接着又给服务端发送了ack=y+1,ACK=1,seq=x+1 简单总结:其实说白了三次握手就是来回来去的三次请求,每次请求携带上次一堆的TCP报文头,根据报文头是否正确从而建立连接。 面试官:为什么不是五次握手或者两次握手? 不念:假设如果是两次握手的话,第一次客户端握手过去结果卡在某个地方了,没有到达服务端。 可是客户端再次重新又发送了第一次握手过去,服务端收到了并握手返回,接着彼此就建立了连接。 意外的是,之前卡住的第一次握手又死灰复燃发送到了服务端。 服务端直接返回一个第二次握手。这个时候服务器也就开辟了一个资源等待接收客户端的数据。 可是客户端直接就忽略了该回合的第二次握手,因为之前已经通信过了。 如果要是三次握手的话,那个第二次握手发回去之后客户端发现第一次握手已经被丢弃了,就会发送个复位的报文过去,避免了资源的开销。 说白了就是两次握手可能会导致服务端资源的一个浪费。三次握手会有一个复位的报文从而避免这种情况。 不念:既然三次握手都可以保证连接,四次五次握手就有些浪费资源了。 面试官:不错,继续聊一聊为什么是四次挥手。 不念:好的。 第一次挥手,客户端发送报文,FIN=1,seq=u,此时进入FIN-WAIT-1状态。 第二次挥手,服务端就收到报文,这是便进入CLOSE_WAIT状态,返回一个报文,ACK=1,ack=u+1 seq=v。客户端收到这个报文后,直接进入到FIN-WAIT-2状态,此时客户端到服务端的连接断开了。 第三次挥手,服务端发送连接释放的报文,FIN=1,ack=u+1,seq=w服务端进入LAST-ACK状态。 第四次挥手,客户端收到连接释放的报文后,发应答报文,ACK=1,ack=w+1,seq=u+1,进入到TIME_WAIT状态,等待一会客户端进入到CLOSED状态,服务端收到报文之后就进入到CLOSED状态。 ...