文章目录
1.HTTP回复状态码都代表什么?
###(1)HTTP回复状态码是什么?
状态码是客户端向服务器端发送请求的时候,描述返回的请求结果的参数,通过HTTP回复状态码,用户就可以知道这次请求是正常还是异常错误。
状态码 = 3位数字 + 原因短语
###(2)状态码的类别以及常见的HTTP回复状态码
2.IP分类有哪些,怎么区分的?
IP地址是指互联网的协议地址,全称为:IP Address,IP地址是IP协议中的一种地址格式
IP地址包括五大类:A类,B类,C类,D类,E类
1、IP地址总共分为A类、B类、C类、D类、E类这5类IP地址,通过这5类IP地址的地址范围来区分。
2、1、A类IP地址
一个A类IP地址是指, 在IP地址的四段号码中,第一段号码为网络号码,剩下的三段号码为本地计算机的号码。A类IP地址中网络的标识长度为8位,主机标识的长度为24位,A类网络地址数量较少,有126个网络,每个网络可以容纳主机数达1600多万台。
A类IP地址 地址范围1.0.0.1到127.255.255.254。127表示的是回环测试相应的地址。
2、B类IP地址
一个B类IP地址是指,在IP地址的四段号码中,前两段号码为网络号码。B类IP地址中网络的标识长度为16位,主机标识的长度为16位,B类网络地址适用于中等规模的网络,有16384个网络,每个网络所能容纳的计算机数为6万多台。
B类IP地址地址范围128.0.0.1-191.255.255.254。
3、C类IP地址
一个C类IP地址是指,在IP地址的四段号码中,前三段号码为网络号码,剩下的一段号码为本地计算机的号码。C类IP地址中网络的标识长度为24位,主机标识的长度为8位,C类网络地址数量较多,有209万余个网络。适用于小规模的局域网络,每个网络最多只能包含254台计算机。
C类IP地址范围192.0.0.1-223.255.255.254。
4、D类IP地址
D类IP地址在历史上被叫做多播地址,即组播地址。在以太网中,多播地址命名了一组应该在这个网络中应用接收到一个分组的站点。多播地址的最高位必须是“1110”,范围从224.0.0.0到239.255.255.255。
5、E类IP地址
E类IP地址中是以“11110”开头,E类IP地址都保留用于将来和实验使用。
私有的IP地址只在局域网内有效,不能出现在Internet上,公有IP地址用在广域网上,是唯一的,除了私有IP地址和特殊用途的IP地址就是公有IP地址。
对于特殊的IP地址:
127.0.0.0 ~ 127.255.255.255 永远表示本机的IP地址,主要用于测试。
169.254.x.x 如果我们的主机使用了DHCP功能自动获取一个IP地址,那么当我们的DHCP服务器发生故障的时候,我们的IP地址就在这个169.254.x.x开头的。
0.0.0.0表示所有不清楚的主机和目的网络。
255.255.255.255是子网掩码,用于屏蔽IP地址的一部分以区分网络标识和主机标识,从而区分该IP地址在局域网上还是广域网上。
3.DNS
DNS意为域名系统,它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用UDP端口53。域名结构是一种树形结构,如下:
根域名服务器管理顶级域名服务器,而顶级域名服务器又管理权威域名服务器。
当我们在浏览器输入域名搜索的时候,电脑先在本地浏览器记录搜索是否存在这个域名,没有的话DNS解析器向附近的本DNS服务器发送解析请求,这是一种递归的方式,可快速检索,如果以前使用过这个域名,那本地的DNS就可能存在这个域名和它对应的IP地址,它将回应 请求将这个域名对应的地址发送回给解析器,解析器再返回给浏览器,浏览器最终可访问IP地址。
但是,本地DNS服务器没有这个域名对应的IP地址呢?这时它就会使用迭代的方式(每咨询一次返回一次),首先咨询根域名服务器,就问你知道www.bilibili.com对应的地址吗?根域名服务器说,我不知道,但是我知道谁知道,然后给我们推荐了com域名服务器,这时我们就可以继续通过迭代的方式访问com域名服务器,问它,你知道www.bilibili.com对应的地址吗?com域名服务器回答说,我不知道,但是我知道谁知道,然后给我们推荐了bilibli.com域名服务器,最后,我们继续通过迭代的方式访问bilibili.com,它说,我知道你要找的IP地址,然后将www.bilibili.com对应的IP地址返回给DNS服务器,DNS服务器又返回给解析器,解析器最后返回给浏览器。
4.IP数据包校验和算法和TCP数据包校验和算法都包括哪些
本人通过在网络上和谢希仁的《计算机网络》一书中,查到累加和算法和CRC算法可以用在IP首部、TCP数据包、UDP数据包的校验,下面主要简述对于IP首部和TCP数据报文校验的累加和算法原理及实现。
(1)IP数据报校验和
下图为IP数据报文格式:
对于首部校验和:占16位。这个字段只检验数据报的首部,但不包括数据部分。这是因为数据报每经过一个路由器都要重新计算首部校验和(一些字段,例如生存时间、标识、标志等都可能发生变化)。不检验数据部分可以减少计算的工作量。而且为了进一步减少工作量,IP首部的校验和不采用复杂的CRC校验码,而是用累加和算法。
IP数据报首部累加和校验:
在发送端,先把IP数据报的首部划分为许多个16位字的序列,并把检验和字段置为0。用反码算术运算把所有的16位字相加后,得到和的反码,并将其写入首部检验和字段。
在接收端,收到数据报后,把首部的所有16位字再使用反码算术运算相加一次。将得到 的和取反码,即得到接收方校验和的计算结果。若首部未发生任何变化,则此结果必为0,若为0则保留这个数据报,否则认为是出错了,并将丢弃这个数据报。
IP数据报首部校验过程如下:
(2)TCP数据报校验和
TCP用户数据报文的首部和伪首部:
TCP数据报文检验和:
TCP用户数据报文首部检验和的计算方法有些特殊。在计算校验和时,要在TCP用户数据报之前添加12个字节的伪首部。这个伪首部仅仅是为了临时检验和而加上的,既不会向下传送也不会向上递交。上图给出了伪首部各字段的内容。
TCP计算检验和方法和IP数据报首部检验的方法类似。但是 不同的是:IP数据报的检验和只检验IP数据报的首部,但是TCP数据报的检验和是把首部和数据部分一起都检验。
在发送方,先把检验和字段置0,再把伪首部和TCP用户数据报看作是许多16位的字串接起来的。若TCP用户数据报的数据部分不是偶数个字节,则要填入一个全0的字节(但此字节不发送)。然后进行二进制反码计算出这些16位字的和。再将此和的二进制反码写入检验和字段后,就将这样的TCP用户数据发送出去了(不包括伪首部)。
在接收方,把收到的TCP用户数据报连同伪首部,以及可能的填充全0字节一起,按照二进制反码求这些16位字的和。当无差错时其结果全为1。否则表明有差错,接收方应该丢弃该TCP用户数据报(也可以上交应用层,但附上了差错警告)。
下图为计算TCP检验和的例子。这里假定用户数据报长度为15字节,总字节数非偶数字,因此要添加一个全0的字节。
对于CRC检验,可看下面视频学习:
https://www.bilibili.com/video/BV1V4411Z7VA?spm_id_from=333.337.search-card.all.click&vd_source=a222a0ca5ddb4bd91f22c1d4fa598706
5.长连接和短连接的区别,什么是心跳包?什么时候用长连接? 短连接?
一、长连接和短连接的区别:
(1)、长连接与短连接:
长连接:client方与server方先建立连接,连接建立后不断开,然后再进行报文发送和接收。这种方式下由于通讯连接一直存在。此种方式常用于点对点通信。
短连接:client方与server每进行一次报文收发交易时才进行通讯连接,交易完毕后立即断开连接。此方式常用于一点对多点通讯。
(2)、短连接与长连接的操作过程:
短连接的操作步骤是:建立连接——数据传输——关闭连接…建立连接——数据传输——关闭连接
长连接的操作步骤是:建立连接——数据传输…(保持连接)…数据传输——关闭连接
二、什么时候用长连接? 短连接?
长连接:短连接多用于操作频繁,点对点的通讯,而且长连接数不能太多的情况。每个TCP连接的建立都需要三次握手,每个TCP连接的断开要四次握手。
如果每次操作都要建立连接然后再操作的话处理速度会降低,所以每次操作下次操作时直接发送数据就可以了,不用再建立TCP连接。
例如:数据库的连接用长连接,如果用短连接频繁的通信会造成socket错误,频繁的socket创建也是对资源的浪费。
短连接:web网站的http服务一般都用短连接。因为长连接对于服务器来说要耗费一定的资源。像web网站这么频繁的成千上万甚至上亿客户端的连接用短连接更省一些资源。
试想如果都用长连接,而且同时用成千上万的用户,每个用户都占有一个连接的话,可想而知服务器的压力有多大。所以并发量大,但是每个用户又不需频繁操作的情况下需要短连接。总之:长连接和短连接的选择要视需求而定。
三、心跳包
1、心跳包之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着。事实上这是为了保持长连接,至于这个包的内容,是没有什么特别规定的,不过一般都是很小的包,或者只包含包头的一个空包。
在TCP的机制里面,本身是存在有心跳包的机制的,也就是TCP的选项:SO_KEEPALIVE。系统默认是设置的2小时的心跳频率。但是它检查不到机器断电、网线拔出、防火墙这些断线。而且逻辑层处理断线可能也不是那么好处理。一般,如果只是用于保活还是可以的。
心跳包一般来说都是在逻辑层发送空的echo包来实现的。下一个定时器,在一定时间间隔下发送一个空包给客户端,然后客户端反馈一个同样的空包回来,服务器如果在一定时间内收不到客户端发送过来的反馈包,那就只有认定说掉线了。
其实,要判定掉线,只需要send或者recv一下,如果结果为零,则为掉线。但是,在长连接下,有可能很长一段时间都没有数据往来。理论上说,这个连接是一直保持连接的,但是实际情况中,如果中间节点出现什么故障是难以知道的。更要命的是,有的节点(防火墙)会自动把一定时间之内没有数据交互的连接给断掉。在这个时候,就需要我们的心跳包了,用于维持长连接,保活。
在获知了断线之后,服务器逻辑可能需要做一些事情,比如断线后的数据清理呀,重新连接呀……当然,这个自然是要由逻辑层根据需求去做了。
总的来说,心跳包主要也就是用于长连接的保活和断线处理。一般的应用下,判定时间在30-40秒比较不错。如果实在要求高,那就在6-9秒。
2、心跳检测步骤:
1 客户端每隔一个时间间隔发生一个探测包给服务器
2 客户端发包时启动一个超时定时器
3 服务器端接收到检测包,应该回应一个包
4 如果客户机收到服务器的应答包,则说明服务器正常,删除超时定时器
5 如果客户端的超时定时器超时,依然没有收到应答包,则说明服务器挂了