计算机网络面经

ping命令的工作原理

1.ping发送一个ICMP(Internet Control Messages Protocol),即因特网信报控制协议;接收端回声消息给目的地并报告是否收到所希望的应答。它的原理是:利用网络上机器IP地址的唯一性,给目标IP地址发送一个数据包,通过对方回复的数据包来确定两台网络机器是否连接相通,时延是多少。
2.ping是应用层直接使用网络层ICMP的一个例子,它没有通过运输层的TCP或UDP。所以ICMP属于网络层协议。
3.对于ping命令,我们需要的到达的效果是检查是否联通。那么只需要我们的请求方带上数字标识8(回送请求),如果对方回送的数值是0,那么证明两者是联通的。
4.一个例子:

  • 执行 ping 192.168.0.5:此时ping命令会构建一个固定格式的ICMP请求数据包
  • IP层协议将以地址“192.168.0.5”作为目的地址,本机IP地址作为源地址,加上一些其他的控制信息,构建一个IP数据包发往192.168.0.5。
  • 目的主机相关操作:接收后检查该数据帧,将IP数据包从帧中提取出来,交给本机的IP层协议。IP层检查后,将有用的信息提取后交给ICMP协议。ICMP协议后者处理后,马上构建一个ICMP应答包,发送给主机A。

IPV4每个部分的含义

1.版本:4位,表示是IPV4还是IPV6
2.首部长度:默认20B
3.总长度:首部+数据和的长度,最大65535B,而MTU为1500B
4.标识:用于分片后进行重装
5.标志:MF = 1表示后面还有分片,MF = 0表示是最后一个分片,DF = 0表示允许分片
6.TTL:生存时间,报文经过每个路由器都将减一,当为0时,丢弃该报文
7.协议:6表示TCP,17表示UDP
8.首部校验和:只检验数据报首部
9.源地址和目的地址

epoll如何知道数据已经被完整读取

用epoll + ET模式读取数据,当检查到监听的socket可以读取数据时,使用recv函数读取上面的数据,当该函数返回-1且errno是EAGAIN或EWOULDBLOCK的时候,表示数据已经全部读取完毕。

epoll的ET模式时,如果数据只读了一半,也就是缓冲区的数据只读了一点,然后又来新事件了怎么办?

这里我使用通过epoll_ctl对该文件描述符注册epolloneshot事件,一个线程处理socket时,其他线程将无法处理,当该线程处理完后,需要通过epoll_ctl重置epolloneshot事件

http断点续传

1.http 1.1中定义了断点续传的相关Range和Content-Range字段。

  • 客户端:Range字段,指定第一个字节的位置和最后一个字节的位置,有多种格式,可以具体的指示需要哪些字节,甚至可以指定多个范围值
  • 服务端:Content-Range字段,返回当前接受的范围和文件总大小,响应完成后,返回的响应头内容也不一样,例如200 OK表示不使用断点续传的方式,206则表示使用断点续传的方式
  • 增强校验:在实际场景中,会出现一种情况,即在终端发起续传请求时,URL 对应的文件内容在服务器端已经发生变化,此时续传的数据肯定是错误的。如何解决这个问题了?显然此时需要有一个标识文件唯一性的方法。在 RFC2616 中也有相应的定义,比如实现Last-Modified 来标识文件的最后修改时间,这样即可判断出续传文件时是否已经发生过改动。同时 FC2616 中还定义有一个 ETag 的头,可以使用 ETag 头来放置文件的唯一标识。
    2.工作原理
  • 第一次请求:客户端发起GET请求一个文件,服务器处理请求,返回文件内容以及相应的 Header,其中包括 Etag(例如:627-4d648041f6b80)(假设服务器支持 Etag 生成并已开启了 Etag)状态码为 200。
  • 第二次请求(断点续传):客户端发起 HTTP GET 请求一个文件,同时发送 If-Range(该头的内容就是第一次请求时服务器返回的 Etag:627-4d648041f6b80)。
    服务器判断接收到的 Etag 和计算出来的 Etag 是否匹配,如果匹配,那么响应的状态码为 206;否则,状态码为 200。