计算机网络常见面试问题和解析
- 1. 网络的几种分层体系结构
- 2. 建立TCP服务器的各个系统调用
- 3. socket网络编程有哪些系统调用?其中close是一次就能直接关闭的吗,半关闭状态是怎么产生的?
- 4. MTU和MSS
- 5. 对路由协议的了解与介绍
- 6. 路由协议所使用的算法
- 7. 路由表的项目包括哪些
- 8. 地址解析协议ARP的过程
- 9. 网际控制报文协议ICMP的过程
- 10. 动态主机配置协议DHCP的过程
- 11. WAN LAN WLAN VLAN的区别
- 12. 介绍一下(虚拟专用网)
- 13. TCP和UDP的区别
- 14. TCP如何保证数据的正确性
- 15. TCP和UDP相关的协议与端口号
- 16. TCP(UDP,IP)等首部的认识(http请求报文构成)
- 17. 网络层分片的原因与具体实现
- 18. TCP的三次握手与四次挥手的详细介绍(TCP连接建立与断开是热门问题)
- 19. TCP握手以及每一次握手客户端和服务器端处于哪个状态(11种状态)
- 20. 为什么使用三次握手,两次握手可不可以?
- 21. TIME_WAIT的意义(为什么要等于2MSL)
- 22. 超时重传机制(不太高频)
- 23. TCP怎么保证可靠性(面向字节流,超时重传,应答机制,滑动窗口,拥塞控制,校验等)?
- 24. 流量控制的介绍,采用滑动窗口会有什么问题(死锁可能,糊涂窗口综合征)?
- 25. TCP滑动窗口协议
- 26. 拥塞控制和流量控制的区别
- 27. TCP拥塞控制,算法名字?(极其重要)
- 28 网页解析的过程与实现方法
- 29. 应用层协议常用的端口号
- 30. http协议与TCP联系
- 31. http/1.0和http/1.1的区别
- 32. http的请求方法有哪些?get和post的区别。
- 33. http的状态码
- 34. http和https的区别,由http升级为https需要做哪些操作
- 35. https的具体实现,怎么确保安全性
- 36. 在浏览器输入一个URL的流程,这个过程中浏览器做了什么(如www.baidu.com)
- 37. URL包括哪三个部分?
- 38. 长连接与短连接的区别以及使用场景
- 39. 一个机器能够使用的端口号上限是多少,为什么?可以改变吗?那如果想要用的端口超过这个限制怎么办?
- 40. 介绍一下ping的过程,分别用到了哪些协议
- 41. 对称密码和非对称密码体系
- 42. 数字证书的了解(高频)
- 43. 客户端为什么信任第三方证书
- 44. RSA加密算法(非对称加密,用公匙和私匙实现);
- 45. MD5原理(MD5是密码散列函数)=> SHA安全散列算法替代
- 46. 单条记录高并发访问的优化
- 47. 数据流和粘包问题
- 48. 一台机器最多可以建立多少tcp连接?
- 49. IO多路复用(select,poll,epoll的区别)(搜狗面试)
- 50. 有没有抓过TCP包,描述一下
- 51. 一个ip配置多个域名,靠什么识别?
- 52. 服务器攻击(DDos攻击)
1. 网络的几种分层体系结构
(1)OSI七层模型
- 物理层: 通过媒介传输比特,确定机械及电气规范,传输单位为 bit,主要包括的协议为: IEE802.3 CLOCK RJ45
- 数据链路层: 将比特组装成帧和点到点的传递,传输单位为帧,主要包括的协议为 MAC VLAN PPP
- 网络层:负责数据包从源到宿的传递和网际互连,传输单位为包,主要包括的协议为 IP ARP ICMP
- 传输层:提供端到端的可靠报文传递和错误恢复,传输单位为报文,主要包括的协议为 TCP UDP
- 会话层:建立、管理和终止会话,传输单位为 SPDU,主要包括的协议为 RPC NFS
- 表示层: 对数据进行翻译、加密和压缩,传输单位为 PPDU,主要包括的协议为 JPEG ASII
- 应用层: 允许访问 OSI 环境的手段,传输单位为 APDU,主要包括的协议为 FTP HTTP DNS
(2)TCP/IP 4 层模型包括:
1)网络接口层:MAC VLAN
2)网络层:IP ARP ICMP
3)传输层:TCP UDP
4)应用层:HTTP DNS SMTP
(3)OSI七层模型和TCP/IP四层模型的关系
1)OSI定义了服务、接口、分层、协议的概念,TCP/IP借鉴了OSI的这个概念建立了TCP/IP模型。
2)OSI先有模型,后有协议,先有标准,后进行实践,而TCP/IP则相反。
3)OSI是一种理论模型,而TCI/IP已经被广泛使用,成为网络互连实际上的标准。
2. 建立TCP服务器的各个系统调用
建立一个TCP服务器需要涉及到以下的几个系统调用:
- socket():开启一个套接字
- bind():绑定IP地址和端口号,注意绑定的时候,服务器一般是要主动绑定IP地址和端口号的,但是客户端一般是不需要的,因为客户端发送连接的时候,内核会自动分配一个端口号给它。
- listen():监听是否有客户端请求
- accept():阻塞进程,等待客户端的接入,接入之后产生收发的另外一个套接字,注意客户端的地址和端口号是在accept接收到的参数中找到的。
- send():有客户端的接入之后,发送数据 receive():有客户端接入之后,接收数据 close():关闭套接字
3. socket网络编程有哪些系统调用?其中close是一次就能直接关闭的吗,半关闭状态是怎么产生的?
除了上面网络编程的一些常见的系统调用之后,还有客户端的一些调用;
1).connect():客户端主动连接函数,调用这个函数的时候,会添加自己客户端的地址和端口号
2).select():非阻塞监控函数,这个函数非常的重要,一句话说不清楚。
client_sd即使返回的新的套接字,连接套接字,通过连接套接字进行数据的传输。但是上述这种accept()方式存在i一个很大的问题!!!!——即如果没有tcp请求会一直阻塞,而且用户无法得知,效率极低。为了解决上述的办法,引进了套接字监控宏函数。
下面直接给出一个具体的实例是如何调用的,直接给出实例是如何调用的:
上述用的4个操作宏到底有什么用,如何定义的呢??、下面进行详细的介绍:
FD_ZERO,FD_ISSET这些都是套节字结合操作宏 ,看看MSDN上的select函数, 这是在select io模型中的核心,用来管理套节字IO的,避免出现无辜锁定.
int select(int nfds,fd_set FAR *readfds, fd_set FAR *writefds, fd_set FAR *exceptfds, const struct timeval FAR *timeout);
第一个参数在windows下可以忽略,但在linux下必须设为最大文件描述符加1;二是结构fd_set在两个系统里定义不一样)。
所以代码中对这个位置也有特别的注意,为什么对三个套接字取了最大值:
max_sd表示正在被使用的socket类
最后的是超时标准,select是阻塞操作当然要设置超时事件. 接着的三个类型为fd_set的参数分别是用于检查套节字的可读性,可写性,和列外数据性质.
我举个例子 :比如recv(), 在没有数据到来调用它的时候,你的线程将被阻塞如果数据一直不来,你的线程就要阻塞很久.这样显然不好.所以采用select来查看套节字是否可读(也就是是否有数据读了)
步骤如下
socket s;
.....
fd_set set;
while(1)
{
FD_ZERO(&set);//将你的套节字集合清空
FD_SET(s, &set);//加入你感兴趣的套节字到集合,这里是一个读数据的套节字s
select(0,&set,NULL,NULL,NULL);//检查套节字是否可读,
//很多情况下就是是否有数据(注意,只是说很多情况)
//这里select是否出错没有写
if(FD_ISSET(s, &set) //检查s是否在这个集合里面,
{ //select将更新这个集合,把其中不可读的套节字去掉
//只保留符合条件的套节字在这个集合里面
recv(s,...);
}
//do something here
}
也就是说,我们得检测我们选定的套接字中此时可不可读,如果不可读我们就将套接字刷新掉,不比一直进行阻塞等待,等中心建立新的套接字,在进行下一轮,提高之前说的阻塞效率。
3)poll函数:类似select函数,也出管理处理多个描述符,只是管理集合的方式不太一样。
缺点:每次都需要把FD监控的描述符从用户态拷贝到内核态。
4)shutdown: 立即关闭进程,不用考虑套接字的引用计数,close并不能,可能还会早上半关闭状态。
5)close是一次就能直接关闭的吗,半关闭状态是怎么产生的?首先回答第一个,close并不是一次就能直接关闭,调用close只能将套接字的引用计数减1,可能其他进程还在使用这个套接字,所以并不是直接关闭
同时在TCP协议中,发送关闭请求时,需要对方回复确认请求,否则不能确认,就会造成一个办半关闭的状态,这个时候可以接收,不能发送。
4. MTU和MSS
MTU: Maximum Transmit Unit,最大传输单元,即物理接口(数据链路层)提供给其上层(通常是IP层)最大一次传输数据的大小;以普遍使用的以太网接口为例,缺省MTU=1500 Byte,这是以太网接口对IP层的约束,如果IP层有<=1500 byte 需要发送,只需要一个IP包就可以完成发送任务;如果IP层有> 1500 byte 数据需要发送,需要分片才能完成发送,这些分片有一个共同点,即IP Header ID相同。
MSS:Maximum Segment Size ,TCP提交给IP层最大分段大小,不包含TCP Header和 TCP Option,只包含TCP Payload ,MSS是TCP用来限制application层最大的发送字节数。如果底层物理接口MTU= 1500 byte,则 MSS = 1500- 20(IP Header) -20 (TCP Header) = 1460 byte,如果application 有2000 byte发送,需要两个segment才可以完成发送,第一个TCP segment = 1460,第二个TCP segment = 540。
tcp 通讯 MSS 确定
如上图 端口53842 为 A; 端口 80 为 B。
见上图,TCP SYN消息,A 发送给B 的MSS= 1460,告诉B,B发给A最大segment 为1452 byte.
以后每次通讯,可以看出发送的数据都是 1452 byte。
由上图,可以发现 MSS 的值,取决与 发送端和接收端两者较小的 MSS 的值。
5. 对路由协议的了解与介绍
静态路由和动态路由,静态路由用于局域网,内部网络,动态路由用于大型的交换式路由
- RIP:基于距离向量的路由协议,通过计算距离来选择路由的路径
- OSPF:基于链路状态型的路由,给每一个路径有一个权重,并计算路径的代价最小值,选择这条路径
- EGP:外部网关协议
- BGP:一种常见的外部网关协议,一种矢量的路由协议,它通过维护IP路由表或‘前缀’表来实现自治系(AS)之间的可达性。
6. 路由协议所使用的算法
路由算法主要分以下两类:
总体式路由算法:每个路由器都拥有网络中其他路由器的全部信息,以及网络的流量状态。也叫LS (链路状态)算法。
分散式路由算法:每个路由器只有与它直接相连的路由器的信息,没有网络中每个路由器的信息。也叫DV (距离向量)算法。
LS算法
链路状态算法(也称最短路径算法)发送路由信息到互联网上所有的结点,对于每个路由器,仅发送它的路由表中描述了其自身链路状态的那一部分。
采用LS算法时,每个路由器必须遵循以下步骤:
1、确认在物理上与之相连的路由器并获得它们的IP地址。当一个路由器开始工作后,它首先向整个网络发送一个“HELLO”分组数据包。每个接收到数据包的路由器都将返回一条消息,其中包含它自身的IP地址。
2、测量相邻路由器的延时(或者其他重要的网络参数,比如平均流量)。为做到这一点,路由器向整个网络发送响应分组数据包。每个接收到数据包的路由器返回一个应答分组数据包。将路程往返时间除以2,路由器便可以计算出延时。(路程往返时间是网络当前延迟的量度,通过一个分组数据包从远程主机返回的时间来测量。)该时间包括了传输和处理两部分的时间——也就是将分组数据包发送到目的地的时间以及接收方处理分组数据包和应答的时间。
3、向网络中的其他路由器广播自己的信息,同时也接收其他路由器的信息。
在这一步中,所有的路由器共享它们的知识并且将自身的信息广播给其他每一个路由器。这样,每一个路由器都能够知道网络的结构以及状态。
4、使用一个合适的算法,确定网络中两个节点之间的最佳路由。
在这一步中,路由器选择通往每一个节点的最佳路由。它们使用一个算法来实现这一点,如Dijkstra最短路径算法。在这个算法中,一个路由器通过收集到的其他路由器的信息,建立一个网络图。这个图描述网络中的路由器的位置以及它们之间的链接关系。每个链接都有一个数字标注,称为权值或成本。这个数字是延时和平均流量的函数,有时它仅仅表示节点间的跃点数。例如,如果一个节点与目的地之间有两条链路,路由器将选择权值最低的链路。
DV算法
距离向量算法(也称为Bellman-Ford算法)则要求每个路由器发送其路由表全部或部分信息,但仅发送到邻近结点上。从本质上来说,链路状态算法将少量更新信息发送至网络各处,而距离向量算法发送大量更新信息至邻接路由器。由于链路状态算法收敛更快,因此它在一定程度上比距离向量算法更不易产生路由循环。但另一方面,链路状态算法要求比距离向量算法有更强的CPU能力和更多的内存空间,因此链路状态算法将会在实现时显得更昂贵一些。
Dijkstra算法执行下列步骤:
1、路由器建立一张网络图,并且确定源节点和目的节点,我们设为V1和V2。然后路由器建立一个矩阵,称为“邻接矩阵”。在这个矩阵中,各矩阵元素表示权值。例如,[i, j]是节点Vi与Vj之间的链路权值。如果节点Vi与Vj之间没有链路直接相连,它们的权值设为“无穷大”。
2、路由器为网路中的每一个节点建立一组状态记录。此记录包括三个字段:
前序字段——表示当前节点之前的节点。
长度字段——表示从源节点到当前节点的权值之和。
标号字段——表示节点的状态。每个节点都处于一个状态模式:“永久”或“暂时”。
3、路由器初始化(所有节点的)状态记录集参数,将它们的长度设为“无穷大”,标号设为“暂时”。
4、路由器设置一个T节点。例如,如果设V1是源T节点,路由器将V1的标号更改为“永久”。当一个标号更改为“永久”后,它将不再改变。一个T节点仅仅是一个代理而已。
5、路由器更新与源T节点直接相连的所有暂时性节点的状态记录集。
6、路由器在所有的暂时性节点中选择距离V1的权值最低的节点。这个节点将是新的T节点。
7、如果这个节点不是V2(目的节点),路由器则返回到步骤5。
8、如果节点是V2,路由器则向前回溯,将它的前序节点从状态记录集中提取出来,如此循环,直到提取到V1为止。这个节点列表便是从V1到V2的最佳路由。
7. 路由表的项目包括哪些
路由表中表项内容一bai般包括:
1、destination:目的du地址,用来标识IP包的目的地址或者目的网络。zhi
2、mask:网络掩码,与目的地址一起标识目的主机或者路由器所在的网段的地址。
3、pre:标识路由加入IP路由表的优先级。可能到达一个目的地有多条路由,但是优先级的存在让他们先选择优先级高的路由进行利用。
4、nexthop:下一跳IP地址,说明IP包所经过的下一个路由器。
5、interface:输出接口,说明IP包将从该路由器哪个接口转发。
6、cost:路由开销,当到达一个目的地的多个路由优先级相同时,路由开销最小的将成为最优路由。
8. 地址解析协议ARP的过程
地址解析协议,即 ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。 它是IPv4中网络层必不可少的协议,不过在IPv6中已不再适用,并被邻居发现协议(NDP)所替代。
1)当主机 A 向本局域网上的某台主机 B 发送 IP 数据报时,就先在其 ARP 高速缓存中查看有无主机 B 的 IP 地址。如有,就在 ARP 高速缓存中查出其对应的硬件地址,再把这个硬件地址写入 MAC 帧,然后通过局域网把该 MAC 帧发往此硬件地址。
2)也有可能查不到主机 B 的 IP 地址。这可能主机 B 才入网,或者主机 A 刚刚加电,其高速缓存还是空的。这种情况下,主机 A 自动运行 ARP,然后按照以下步骤找出主机 B 的硬件地址。
- ARP进程在本局域网上广播一个ARP请求分组。ARP请求报文中的发送端IP地址和发送端MAC地址为主机A的IP地址和MAC地址,目标IP地址和目标MAC地址为主机B的IP地址和全0的MAC地址。
- 本局域网所有主机运行的ARP进程收到此ARP请求分组。
- 主机B的IP与请求分组里面的IP一致,将ARP请求报文中的发送端(即主机A)的IP地址和MAC地址存入自己的ARP表中。之后向A发送ARP响应分组(单播);其他主机则不理睬
- 主机 A 收到从主机 B 发来的 ARP 响应分组时,就在其 ARP 高速缓存中写入主机 B 的 IP
地址到硬件地址的映射。本机缓存是有生存期的,生存期结束后,将再次重复上面的过程。主机B的MAC地址一旦确定,主机A就能向主机B发送IP通信了。
如果所要找的主机和源主机不在同一个局域网,则源主机发送 ARP 请求分组,找到本局域网上的一个路由器 R1 的硬件地址。剩下的工作由 R1 完成。
ARP(地址解析协议) https://www.cnblogs.com/sxiszero/p/11053027.html
计算机网络–ARP地址解析协议详解 https://blog.csdn.net/u013309870/article/details/77427112
9. 网际控制报文协议ICMP的过程
问题:
-
1)IP 协议本身不提供差错报告和差错控制机制来保证数据报递交的有效性,在路由器无法递交一个数据报,或者数据报生存时间为 0 时,路由器都会直接丢弃掉这个数据报。尽管路由器 IP层认为这样的处理是合理的(可以提高数据报处理效率),但是在很多情况下,源主机还是期望在数据报递交出现异常的情况下得到相关的失败信息,以便进行重传或者其他处理。
2)另一方面,IP 协议缺少一个辅助机制,即主机的管理和查询机制。在某些情况下,源主机需要确定另一个主机或者路由器是否是活跃的,对于不活跃的主机,就没有必要再向它发送数据报了,因为这是徒劳的。在另外一些情况下,一个主机的管理员期望能获得另一个主机或者路由器上的信息,以根据这些信息进行主机自身的配置、数据报发送控制等。
解决:
- 设计人员给 TCP/IP 协议引进了一种具有特殊用途的报文机制,称为网际报文控制协议(Internet Control Message
Protocol,简称 ICMP), ICMP 协议是支持 IP 协议的重要机制,从 TCP/IP 的分层结构上来看,它同 IP 协议一样,处于网络层。
但 ICMP 协议有自己的一套报文格式,且它需要使用 IP 协议来递交报文,即 ICMP 报文是放在 IP
数据报中的数据区域发送的 。
总之,ICMP 协议是支持 IP 协议实现的不可或缺的机制,每一种 TCP/IP 协议的实现都应该支持它。
(1)报文类型: - ICMP 差错报告报文和 ICMP 查询报文,分别用于解决上面说到的两个问题。
- 差错报告报文主要用来向 IP 数据报源主机返回一个差错报告信息,这个错误报告信息产生的原因是路由器或主机不能对当前数据报进行正常的处理,例如无法将数据报递交给有效的协议上层,又例如数据报因为生存时间TTL 为 0 而被删除等。
- 查询报文用于一台主机向另一台主机查询特定的信息,通常查询报文都是成对出现的,即源主机发起一个查询报文,在目的主机收到该报文后,会按照查询报文约定的格式为源主机返回一个应答报文。两大种类的ICMP 报文及其常见类型如表 11-1 所示。
https://www.cnblogs.com/qinzhou/p/8386043.html 网际控制报文协议(ICMP)
10. 动态主机配置协议DHCP的过程
动态主机配置协议DHCP https://www.cnblogs.com/myworld7/p/8413659.html
11. WAN LAN WLAN VLAN的区别
局域网(Local Area Network,LAN)
是指在某一区域内由多台计算机互联成的计算机组。一般是方圆几千米以内。局域网可以实现文件管理、应用软件共享、打印机共享、工作组内的日程安排、电子邮件和传真通信服务等功能。局域网是封闭型的,可以由办公室内的两台计算机组成,也可以由一个公司内的上千台计算机组成。
广域网 (Wide Area Network,WAN)
是一种跨越大的、地域性的计算机网络的集合。通常跨越省、市,甚至一个国家。广域网包括大大小小不同的子网,子网可以是局域网,也可以是小型的广域网。
局域网和广域网的区别
局域网是在某一区域内的,而广域网要跨越较大的地域,那么如何来界定这个区域呢?例如,一家大型公司的总公司位于北京,而分公司遍布全国各地,如果该公司将所有的分公司都通过网络联接在一起,那么一个分公司就是一个局域网,而整个总公司网络就是一个广域网。
无线局域网(Wireless LAN, WLAN)
WLAN 利用电磁波在空气中发送和接受数据,而无需线缆介质。WLAN 的数据传输速率现在已经能够达到 11Mbps,传输距离可远至 20km 以上。作为传统布线网络的一种替代方案或延伸,无线局域网把个人从办公桌边解放了出来,使他们可以随时随地获取信息,提高了员工的办公效率。
WLAN 使用 ISM (Industrial、Scientific、Medical) 无线电广播频段通信。WLAN 的 802.11a 标准使用 5 GHz 频段,支持的最大速度为 54 Mbps,而 802.11b 和 802.11g 标准使用 2.4 GHz 频段,分别支持最大 11 Mbps 和 54 Mbps 的速度。
那我们平时上网用的 WIFI,又是什么呢?
WIFI 是实现无线组网的一种协议(实际上是握手协议),WIFI 是 WLAN 的一个标准。WIFI 网络工作在 2.4G 或 5G 的频段。另外 3G/4G 也属于无线上网,但协议都不一样,费用很高!
虚拟局域网(Virtual Local Area Network,VLAN)
虚拟局域网( VLAN ),是指网络中的站点不拘泥于所处的物理位置,根据需要灵活划分不同的逻辑子网中的一种网络技术。
例如位于不同楼层的用户或者不同部门的用户可以根据需要加入不同的虚拟局域网:1 楼划分为 10.221.1.0 网段,2 楼划分为 10.221.2.0 网段等。
12. 介绍一下(虚拟专用网)
13. TCP和UDP的区别
1)、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2)、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保 证可靠交付
3)、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4)、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5)、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6)、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
14. TCP如何保证数据的正确性
- 1)、序列号、确认应答、超时重传
数据到达接收方,接收方需要发出一个确认应答,表示已经收到该数据段,并且确认序号会 说明了它下一次需要接收的数据序列号。如果发送发迟迟未收到确认应答,那么可能是发送的数据丢失,也可能是确认应答丢失,这时发送方在等待一定时间后会进行重传。这个时间一般是 2*RTT(报文段往返时间)+一个偏差值。 - 2)、窗口控制与高速重发控制/快速重传(重复确认应答)
TCP会利用窗口控制来提高传输速度,意思是在一个窗口大小内,不用一定要等到应答才能发送下一段数据,窗口大小就是无需等待确认而可以继续发送数据的最大值。如果不使用窗口控 制,每一个没收到确认应答的数据都要重发。使用窗口控制,如果数据段 1001-2000 丢失,后面数据每次传输,确认应答都会不停地发送 序号为 1001 的应答,表示我要接收1001 开始的数据,发送端如果收到 3 次相同应答,就会立刻进行重发;但还有种情况有可能是数据都收到了,但是有的应答丢失了,这种情况不会进行重发,因为发送端知道,如果是数据段丢失,接收端不会放过它的,会疯狂向它提醒… - 3)、拥塞控制 如果把窗口定的很大,发送端连续发送大量的数据,可能会造成网络的拥堵(大家都在用网,你在这狂发,吞吐量就那么大,当然会堵),甚至造成网络的瘫痪。所以 TCP 在为了防止这种情 况而进行了拥塞控制。
慢启动:定义拥塞窗口,一开始将该窗口大小设为 1,之后每次收到确认应答(经过一个 rtt), 将拥塞窗口大小*2。
拥塞避免:设置慢启动阈值,一般开始都设为 65536。拥塞避免是指当拥塞窗口大小达到这个阈值,拥塞窗口的值不再指数上升,而是加法增加(每次确认应答/每个 rtt,拥塞窗口大小+1),以此来避免拥塞。 将报文段的超时重传看做拥塞,则一旦发生超时重传,我们需要先将阈值设为当前窗口大小 的一半,并且将窗口大小设为初值 1,然后重新进入慢启动过程。
快速重传:在遇到 3 次重复确认应答(高速重发控制)时,代表收到了 3 个报文段,但是这 之前的 1 个段丢失了,便对它进行立即重传。
然后,先将阈值设为当前窗口大小的一半,然后将拥塞窗口大小设为慢启动阈值+3 的大小。
这样可以达到:在TCP 通信时,网络吞吐量呈现逐渐的上升,并且随着拥堵来降低吞吐量, 再进入慢慢上升的过程,网络不会轻易的发生瘫痪。
15. TCP和UDP相关的协议与端口号
(1)TCP对应的协议:
- FTP:定义了文件传输协议,使用21端口。
- Telnet:一种用于远程登陆的端口,使用23端口,用户可以以自己的身份远程连接到计算机上,可提供基于DOS模式下的通信服务。
- SMTP:邮件传送协议,用于发送邮件。服务器开放的是25号端口。
- POP3:它是和SMTP对应,POP3用于接收邮件。POP3协议所用的是110端口。
- HTTP:是从Web服务器传输超文本到本地浏览器的传送协议。
(2)UDP对应的协议:
- DNS:用于域名解析服务,将域名地址转换为IP地址。DNS用的是53号端口。
- SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。
- TFTP(Trival File Tran敏感词er Protocal),简单文件传输协议,该协议在熟知端口69上使用UDP服务。
16. TCP(UDP,IP)等首部的认识(http请求报文构成)
https://blog.csdn.net/zhangliangzi/article/details/52554439 IP、TCP、UDP首部详解
https://www.cnblogs.com/myseries/p/11239662.html HTTP报文结构和内容
17. 网络层分片的原因与具体实现
原因:每一种物理网络都会规定链路层数据帧的最大长度,称为链路层MTU(Maximum Transmission Unit).IP协议在传输数据包时,若IP数据报加上数据帧头部后长度大于MTU,则将数据报文分为若干分片进行传输,并在目标系统中进行重组。比如说,在以太网环境中可传输最大IP报文大小(MTU)为1500字节。如果要传输的数据帧大小超过1500字节,即IP数据报长度大于1472(1500-20-8=1472,普通数据报)字节,则需要分片之后进行传输。
具体实现:TCP分段,IP分片
18. TCP的三次握手与四次挥手的详细介绍(TCP连接建立与断开是热门问题)
两张动图-彻底明白TCP的三次握手与四次挥手 https://blog.csdn.net/qzcsu/article/details/72861891
19. TCP握手以及每一次握手客户端和服务器端处于哪个状态(11种状态)
11种状态:
1)、LISTEN:首先服务端需要打开一个socket进行监听,状态为LISTEN.
2)、SYN_SENT:客户端通过应用程序调用connect进行active open.于是客户端tcp发送一个SYN以请求建立一个连接.之后状态置为SYN_SENT.
3)、SYN_RECV:服务端应发出ACK确认客户端的SYN,同时自己向客户端发送一个SYN. 之后状态置为SYN_RECV
4)、ESTABLISHED: 代表一个打开的连接,双方可以进行或已经在数据交互了。
5)、FIN_WAIT1:主动关闭(active close)端应用程序调用close,于是其TCP发出FIN请求主动关闭连接,之后进入FIN_WAIT1状态.
6)、CLOSE_WAIT:被动关闭(passive close)端TCP接到FIN后,就发出ACK以回应FIN请求(它的接收也作为文件结束符传递给上层应用程序),并进入CLOSE_WAIT.
7)、FIN_WAIT2:主动关闭端接到ACK后,就进入了FIN-WAIT-2 .
8)、LAST_ACK:被动关闭端一段时间后,接收到文件结束符的应用程序将调用CLOSE关闭连接。这导致它的TCP也发送一个 FIN,等待对方的ACK.就进入了LAST-ACK . /
9)、TIME_WAIT:在主动关闭端接收到FIN后,TCP就发送ACK包,并进入TIME-WAIT状态。
10)、CLOSING: 这种状态比较特殊,实际情况中应该是很少见,属于一种比较罕见的例外状态。正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的 ACK报文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什 么情况下会出现此种情况呢?其实细想一下,也不难得出结论:那就是如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报 文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。
11)、CLOSED: 被动关闭端在接受到ACK包后,就进入了closed的状态。连接结束
20. 为什么使用三次握手,两次握手可不可以?
- 因为保证可靠的最小传输的次数就是三次握手,A能发,B能收发,A能收,保证可靠,
- 两次握手显然不可以,不仅不能保证可靠传输,可能导致失效的连接请求被服务端接收,A开始请求无效,后来重发请求成功和B通信,B后来又会和失效的A连接。
21. TIME_WAIT的意义(为什么要等于2MSL)
- 保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。
22. 超时重传机制(不太高频)
- 超时重传指的是,发送数据包在一定的时间周期内没有收到相应的ACK,等待一定的时间,超时之后就认为这个数据包丢失,就会重新发送。这个等待时间被称为RTO.
- 检测丢失segment的方法从概念上讲还是比较简单的,每一次开始发送一个TCP segment的时候,就启动重传定时器,定时器的时间一开始是一个预设的值(Linux规定为1s),随着通讯的变化以及时间的推移,这个定时器的溢出值是不断的在变化的,有相关算法计算RTO[参考:文章…],如果在ACK收到之前,定时器到期,协议栈就会认为这个片段被丢失,重新传送数据。
23. TCP怎么保证可靠性(面向字节流,超时重传,应答机制,滑动窗口,拥塞控制,校验等)?
- 1.面向字节流:以流的方式传输,缓存区满了就划分为几段进行传输
2.超时重传:发送数据包在一定的时间周期内没有收到相应的ACK,等待一定的时间,超时之后就认为这个数3.据包丢失,就会重新发送
4.应答机制:3次握手和4次挥手
5.滑动窗口:控制发送方发送窗口的大小,控制流量
6.拥塞控制:控制传输上流量
7.校验:防止数据传输过长中发生的错误
24. 流量控制的介绍,采用滑动窗口会有什么问题(死锁可能,糊涂窗口综合征)?
主要介绍再接收端和发送端速率不匹配的状况下,TCP协议栈滑动窗口动态调整机制产生的一种问题 叫糊涂窗口综合症,
这个问题可以归结为小包的问题,就是由于发送端和接收端上的处理不一致,导致网络上产生很多的小包,之前也介绍过避免网络上产生过多小包的措施,比如Nagle算法。在滑动窗口机制下,如果发送端和接收端速率很不一致,也会产生这种比较犯傻的状态:发送方发送的数据,只要一个大大的头部,携带数据很少。
对于接收端来讲,如果接收很慢,一次接收1个字节或者几个字节,这个时候接收端 缓冲区很快就会被填满,然后窗口通告为0字节,这个时候发送端停止发送,应用程序收上去1个字节后,发出窗口通告为1字节,发送方收到通告之后,发出1个字节的数据,这样周而复始,传输效率会非常低。
同时如果发送端程序一次发送一个字节,虽然窗口足够大,但是发送仍是一个字节一个字节的传输,效率很低
25. TCP滑动窗口协议
TCP的滑动窗口主要有两个作用,一是提供TCP的可靠性,二是提供TCP的流控特性。同时滑动窗口机制还体现了TCP面向字节流的设计思路。
TCP-IP详解:滑动窗口(Sliding Window) http://blog.csdn.net/wdscq1234/article/details/52444277
26. 拥塞控制和流量控制的区别
流量控制:端对端的流量快慢控制,并保证传输的可靠性
拥塞控制:全局网络的拥塞情况,如果有发生丢包则通过拥塞控制减小窗口,确定出合适(慢开始 拥塞避免 快重传 快恢复)的拥塞窗口。
27. TCP拥塞控制,算法名字?(极其重要)
慢开始 拥塞避免 快重传 快恢复
1.慢开始:最初的TCP在连接建立成功后会向网络中发送大量的数据包,这样很容易导致网络中路由器缓存空间耗尽,从而发生拥塞。因此新建立的连接不能够一开始就大量发送数据包,而只能根据网络情况逐步增加每次发送的数据量,以避免上述现象的发生。
2.拥塞避免:从慢启动可以看到,cwnd可以很快的增长上来,从而最大程度利用网络带宽资源,但是cwnd不能一直这样无限增长下去,一定需要某个限制。TCP使用了一个叫慢启动门限(ssthresh)的变量,当cwnd超过该值后,慢启动过程结束,进入拥塞避免阶段。
3.快重传 :快速重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置重传计时器时间到期
4.快恢复:其实快速恢复并不是单独存在的,它是快速重传的后续处理。通常认为客户端接收到3个ACK后,就会开始快速重传,但是如果还有更多的重复ACK呢,这个时候就是快速恢复要做的。
-
a、当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把ssthresh门限减半(也即cwnd=ssthresh/2).但是接下去并不执行慢开始算法;
b、考虑到此时能连续收到3个ACK,说明网络没有拥塞,执行加法原则,有几个ACK就加几个段的字节数,或者可以将cwnd=ssthresh,直接进入拥塞避免算法。
28 网页解析的过程与实现方法
-
用户输入网址(假设是个html页面,并且是第一次访问),浏览器向服务器发出请求,服务器返回html文件。
-
浏览器开始载入html代码,发现标签内有一个标签引用外部CSS文件。
-
浏览器又发出CSS文件的请求,服务器返回这个CSS文件。
-
浏览器继续载入html中部分的代码,并且CSS文件已经拿到手了,可以开始渲染页面了。
-
浏览器在代码中发现一个标签引用了一张图片,向服务器发出请求。此时浏览器不会等到图片下载完,而是继续渲染后面的代码。
-
服务器返回图片文件,由于图片占用了一定面积,影响了后面段落的排布,因此浏览器需要回过头来重新渲染这部分代码。
-
浏览器发现了一个包含一行Javascript代码的
29. 应用层协议常用的端口号
DNS (domain name system)域名系统
用来将域名映射成IP地址,端口号为TCP或UDP的53。
SMTP简单邮件传输协议
TCP端口号为25。
HTTP(hypertext transfer protocol)超文本传输协议
用于传输internet浏览器使用的普通文本、超文本、音频和视频等数据。端口号TCP 80
HTTPS(secure hypertext transfer protocol)安全文本传输协议
是基于HTTP开发的,HTTPS应用了安全套接字层(SSL)作为HTTP应用层的子层,可以对数据进行加密和压缩。端口号443.
FTP(file transfer protocol)文件传输协议
它是基于传输层的TCP协议。
概述:
文件传输协议,负责将文件从一台计算机传送到另一台计算机上,并且保证其传输的可靠性,客户端提出文件传输请求,服务器接收请求并提供服务。
过程:
首先在本地计算机上启动FTP客户程序,利用他与远程计算机建立连接,远程计算机上的服务端FTP程序被激活。这样本地的FTP程序成为一个客户,而远程FTP程序成为服务器,他们之间通过TCP建立连接,端口号为21.
功能:
1、可以从本地上传和从服务器下载文件
2、能够传输各种类型的文件,包括文件,图片,视频等
3、能够提供对本地和远程计算机的目录操作
4、对文件进行改名删除等操作
FTP协议的客户机与服务器之间需要建立两个连接,一个用于控制数据传输(端口21),一个用于数据传输(端口20)。
数据连接主要用于数据传输,完成文件内容的传输。控制连接主要用于传输FTP控制命令和服务器的回送消息。
TFTP(trivial file transfer protocol)简单文件传输协议
概述
TFTP协议目标是在UDP之上建立一个类似于FTP,但仅支持文件上传和下载功能的传输协议,所以它不包含FTP协议中的目录操作和用户权限等内容。
流程
- server在端口为69的UDP上等待client发出写文件请求包
- client通过UDP发送符合TFTP请求格式的WRQ包给server。从UDP包角度看,该UDP包的源端口由client随意选择,而目标端口则是client的69
- server收到client的这个请求包后,需要发送ACK给client,对于写请求包,Server发送的ACK包确认号为0。
- client发送DATA数据给server,server接收数据并写文件
- 当client发送的DATA数据长度小于512字节时,server认为这次WRQ请求完成。
优点
每个数据包大小固定,这样在内存分配处理的时候比较直接
实现简单
每个数据包都有确认机制,可以实现一定程度的可靠性
缺点
传输效率不高
滑动窗口机制太简单,并且该窗口仅有一个包的大小
超时处理机制并不完善
30. http协议与TCP联系
- TCP协议对应于传输层,而HTTP协议对应于应用层
- TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。关于TCP/IP和HTTP协议的关系,网络有一段比较容易理解的介绍:“我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有很多,比如HTTP、FTP、TELNET等,也可以自己定义应用层协议。WEB使用HTTP协议作应用层协议,以封装HTTP文本信息,然后使用TCP/IP做传输层协议将它发到网络上。”
- TCP和UDP是高速公路上的“卡车”,它们携带的货物就是像HTTP。
31. http/1.0和http/1.1的区别
(1)HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理
HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。
HTTP 1.1则支持持久连接Persistent Connection, 并且默认使用persistent connection. 在同一个tcp的连接中可以传送多个HTTP请求和响应. 多个请求和响应可以重叠,多个请求和响应可以同时进行. 更加多的请求头和响应头(比如HTTP1.0没有host的字段).
(2)在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。
HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。此外,服务器应该接受以绝对路径标记的资源请求。
(3)100(Continue) Status(节约带宽)
HTTP/1.1加入了一个新的状态码100(Continue)。客户端事先发送一个只带头域的请求,如果服务器因为权限拒绝了请求,就回送响应码401(Unauthorized);
(4)HTTP/1.1在1.0的基础上加入了一些cache的新特性,当缓存对象的Age超过Expire时变为stale对象,cache不需要直接抛弃stale对象,而是与源服务器进行重新激活(revalidation)
32. http的请求方法有哪些?get和post的区别。
两种 HTTP 请求方法:GET 和 POST
在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST。
GET - 从指定的资源请求数据。
POST - 向指定的资源提交要被处理的数据
33. http的状态码
当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。
200 - 请求成功
301 - 资源(网页等)被永久转移到其它URL
404 - 请求的资源(网页等)不存在
500 - 内部服务器错误
34. http和https的区别,由http升级为https需要做哪些操作
HTTPS的全称是Secure Hypertext Transfer Protocol(安全超文本传输协议),是在http协议基础上增加了使用SSL加密传送信息的协议
HTTPS和HTTP的区别:
1.https协议需要到ca申请证书,一般免费证书很少,需要交费。
2.http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
3.http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。
4.http的连接很简单,是无状态的。 HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全
35. https的具体实现,怎么确保安全性
HTTPS 在 HTTP 与 TCP 层之间加入了 SSL/TLS 协议。
- 信息加密:交互信息无法被窃取,但你的号会因为「自身忘记」账号而没。
校验机制:无法篡改通信内容,篡改了就不能正常显示,但百度「竞价排名」依然可以搜索垃圾 广告。
身份证书:证明淘宝是真的淘宝网,但你的钱还是会因为「剁手」而没。
(1) 混合加密
-
通过混合加密的方式可以保证信息的机密性,解决了窃听的风险。
HTTPS 采用的是对称加密和非对称加密结合的「混合加密」方式: 在通信建立前采用非对称加密的方式交换「会话秘钥」,后续就不再使用非对称加密。
在通信过程中全部使用对称加密的「会话秘钥」的方式加密明文数据。采用「混合加密」的方式的原因: 对称加密只使用一个密钥,运算速度快,密钥必须保密,无法做到安全的密钥交换。 非对称加密使用两个密钥:公钥和私钥,公钥可以任意分发而私钥保密,解决了密钥交换问题但 速度慢。
(2). 摘要算法
- 摘要算法用来实现完整性,能够为数据生成独一无二的「指纹」,用于校验数据的完整性,解决了篡改 的风险。
客户端在发送明文之前会通过摘要算法算出明文的「指纹」,发送的时候把「指纹 + 明文」一同加密成密文后,发送给服务器,服务器解密后,用相同的摘要算法算出发送过来的明文,通过比较客户端携带的「指纹」和当前算出的「指纹」做比较,若「指纹」相同,说明数据是完整的。
(3). 数字证书
- 客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。 这就存在些问题,如何保证公钥不被篡改和信任度?
所以这里就需要借助第三方权威机构 CA (数字证书认证机构),将服务器公钥放在数字证书(由数字证书认证机构颁发)中,只要证书是可信的,公钥就是可信的。
通过数字证书的方式保证服务器公钥的身份,解决冒充的风险。
36. 在浏览器输入一个URL的流程,这个过程中浏览器做了什么(如www.baidu.com)
1.浏览器首先通过查找内部DNS缓存,查不到依次进行系统DNS缓存,路由器缓存,DNS服务器,一步一步找到并解析IP地址。
2.给对应IP地址的服务器发送搞一个http的请求。
3.百度服务器响应请求,发送html的文档
4.浏览器响应接收到的html的文档对象,解析,并显示。
37. URL包括哪三个部分?
URL包括:服务类型,主机名,路径及文件名
38. 长连接与短连接的区别以及使用场景
短连接
连接->传输数据->关闭连接
比如HTTP是无状态的的短链接,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。
具体就是 浏览器client发起并建立TCP连接 -> client发送HttpRequest报文 -> server接收到报文->server handle并发送HttpResponse报文给前端,发送完毕之后立即调用socket.close方法->client接收response报文->client最终会收到server端断开TCP连接的信号->client 端断开TCP连接,具体就是调用close方法。
也可以这样说:短连接是指SOCKET连接后,发送接收完数据后马上断开连接。
因为连接后接收了数据就断开了,所以每次数据接受处理不会有联系。 这也是HTTP协议无状态的原因之一。
长连接
连接->传输数据->保持连接 -> 传输数据-> …->直到一方关闭连接,多是客户端关闭连接。
长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差。
HTTP在短链接和长连接上的选择:
HTTP是无状态的 ,也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。如果客户端浏览器访问的某个HTML或其他类型的 Web页中包含有其他的Web资源,如JavaScript文件、图像文件、CSS文件等;当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话
HTTP1.1和HTTP1.0相比较而言,最大的区别就是增加了持久连接支持(貌似最新的HTTP1.1 可以显示的指定 keep-alive),但还是无状态的,或者说是不可以信任的。
如果浏览器或者服务器在其头信息加入了这行代码 Connection:keep-alive
TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了带宽。
实现长连接要客户端和服务端都支持长连接。
什么时候用长连接,短连接?
长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况,。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。
而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。
总之,长连接和短连接的选择要视情况而定。
具体网络中的应用的话:
http 1.0一般就指短连接,smtp,pop3,telnet这种就可以认为是长连接。一般的网络游戏应用都是长连接
39. 一个机器能够使用的端口号上限是多少,为什么?可以改变吗?那如果想要用的端口超过这个限制怎么办?
linux socket使用16bit无符号整型表示端口号,最大到65535,不能改变,规定了是16bit二进制数,但是可以复用,即使用同一个端口号来进行通信
40. 介绍一下ping的过程,分别用到了哪些协议
(1)ping的执行流程
ping命令的执行流程见下图。
正常执行流程可以简要描述为:ping命令接收一个IP地址或一个网络域名,如果是域名会将域名转换为IP地址。
判断被ping的目标主机和源主机是否在一个网络上,如果不在一个网络上,则查找路由表,找到通往目标网络的路由器IP地址或默认网关IP地址。
查找本地主机ARP表中是否有该IP对应的MAC地址;如果没有,则通过广播询问该IP的MAC地址;本网络中的主机、路由器都会接收到该询问报文。
拥有该IP地址的本地设备回复应答报文,将该IP对应的MAC地址发给源主机。
为了减少本地广播,本地主机、三层路由器或路由器会适时更新自己的本地ARP表,保存本地IP地址和MAC地址的对应关系。
知道了下一步报文要发往的MAC地址,ping命令使用ICMP协议封装含有对端MAC地址的IP数据报交给交换机,交换机查找自己的MAC与port端口对应表,将数据包传给对应端口的主机。
下面的流程只画了本机流程,交换机和路由器的流程没有画出,源主机信息发送到交换机之后,交换机和路由器根据IP数据报相关信息再一步一步的向前查找目标主机,源主机只需要等待回送回答报文。
(2)ping命令涉及的网络协议
ping是ICMP网际控制报文协议的一个重要应用,因此ping涉及的最重要的一个协议是ICMP。
在ping执行过程中会触发一系列动作,会附带调用其他一些协议功能,完成源主机和目标主机的请求和应答。
DNS:域名系统(Domain Name System),TCP/IP协议中应用层协议,用于解析域名和IP地址。
ICMP:网际控制报文协议(Internet Control Message Protocol)。用于在IP主机、路由器之间传递控制信息。
例如检测网络连通性、主机的可达性。不传输用户数据,只传输控制信息。ICMP的数据要封装在IP数据报中进行传输。
IGMP:网际组管理协议(Internet Group Management Protocol),该协议运行在主机和组播路由器之间。
组播和广播的区别很简单,组播是通知部分人知道的传播形式,而广播是通知到所有人。
IP :网际协议或互联网协议(Internet Protocol)。IP协议位于TCP/IP协议的网络层,ICMP、IGMP及以上层级的报文都要经过IP协议转换封包成IP数据包向下传送。
ARP :地址解析协议(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。
41. 对称密码和非对称密码体系
1).对称密钥密码体系
对称密钥密码体系也叫密钥密码体系,它是指消息发送方和消息接收方必须使用相同的密钥,该密钥必须保密。发送方用该密钥对待发消息进行加密,然后将消息传输至接收方,接收方再用相同的密钥对收到的消息进行解密。
2).非对称密钥密码体系又叫公钥密码体系,它使用两个密钥:一个公共密钥PK和一个私有密钥SK。这两个密钥在数学上是相关的,并且不能由公钥计算出对应的私钥,同样也不能由私钥计算出对应的公钥。
42. 数字证书的了解(高频)
数字证书是经过权威机构(CA)认证的公钥,通过查看数字证书,可以知道该证书是由那家权威机构签发的,证书使用人的信息,使用人的公钥。它有以下特点:
1)、由专门的机构签发的数字证书才安全有效。
2)、签发数字证书是收费的。
3)、不会被冒充,安全可信。
4)、数字证书有使用期限,过了使用期限,证书变为不可用。CA也可以在试用期内,对证书进行作废操作。
43. 客户端为什么信任第三方证书
第三方认证机构,是指具有可靠的执行认证制度的必要能力,并在认证过程中能够客观、公正、独立地从事认证活动的机构。即认证机构是独立于制造厂、销售商和使用者(消费者)的、具有独立的法人资格的第三方机构,故称认证为第三方认证认证机构。
44. RSA加密算法(非对称加密,用公匙和私匙实现);
MD5原理:MD5,全名Message Digest Algorithm 5,是一种摘要算法,通过内置的hash算法将信息摘要成为定长的十六进制字串
RSA加密算法:与DES不同,RSA算法中,每个通信主体都有两个钥匙,一个公钥一个私钥。就是有2把钥匙:使用publicKey可以对数据进行加密,使用私钥才能对数据进行解密。
45. MD5原理(MD5是密码散列函数)=> SHA安全散列算法替代
MD5算法原理及其实现 https://blog.csdn.net/u012611878/article/details/54000607
SHA安全散列算法 https://www.cnblogs.com/mengsuenyan/p/12697811.html
46. 单条记录高并发访问的优化
1).保证在实现功能的基础上,尽量减少对数据库的访问次数;
2).通过搜索参数,尽量减少对表的访问行数,最小化结果集,从而减轻网络负担;
3).能够分开的操作尽量分开处理,提高每次的响应速度;
4).在数据窗口使用SQL时,尽量把使用的索引放在选择的首列;算法的结构尽量简单;
47. 数据流和粘包问题
产生tcp粘包和拆包的原因
我们知道tcp是以流动的方式传输数据,传输的最小单位为一个报文段(segment)。tcp Header中有个Options标识位,常见的标识为mss(Maximum Segment Size最大消息长度)指的是,连接层每次传输的数据有个最大限制MTU(Maximum Transmission Unit),一般是1500比特,超过这个量要分成多个报文段,mss则是这个最大限制减去TCP的header,光是要传输的数据的大小,一般为1460比特。换算成字节,也就是180多字节。
MSS = MTU - header
tcp为提高性能,发送端会将需要发送的数据发送到缓冲区,等待缓冲区满了之后,再将缓冲中的数据发送到接收方。同理,接收方也有缓冲区这样的机制,来接收数据。
发生TCP粘包、拆包主要是由于下面一些原因:
应用程序写入的数据大于套接字缓冲区大小,这将会发生拆包。
应用程序写入数据小于套接字缓冲区大小,网卡将应用多次写入的数据发送到网络上,这将会发生粘包。
进行mss(最大报文长度)大小的TCP分段,当TCP报文长度-TCP头部长度>mss的时候将发生拆包。
接收方法不及时读取套接字缓冲区数据,这将发生粘包。
TCP发送数据的四种情况
假设客户端分别发送了两个数据包D1和D2给服务端,由于服务端一次读取到的字节数是不确定的,故可能存在以下4种情况。
- 服务端分两次读取到了两个独立的数据包,分别是D1和D2,没有粘包和拆包;
- 服务端一次接收到了两个数据包,D1和D2粘合在一起,被称为TCP粘包;
- 服务端分两次读取到了两个数据包,第一次读取到了完整的D1包和D2包的部分内容,第二次读取到了D2包的剩余内容,这被称为TCP拆包;
- 服务端分两次读取到了两个数据包,第一次读取到了D1包的部分内容D1_1,第二次读取到了D1包的剩余内容D1_2和D2包的整包。
- 特例:如果此时服务端TCP接收滑窗非常小,而数据包D1和D2比较大,很有可能会发生第五种可能,即服务端分多次才能将D1和D2包接收完全,期间发生多次拆包。
如何解决拆包粘包
既然知道了tcp是无界的数据流,且协议本身无法避免粘包,拆包的发生,那我们只能在应用层数据协议上,加以控制。通常在制定传输数据时,可以使用如下方法:
1、使用带消息头的协议、消息头存储消息开始标识及消息长度信息,服务端获取消息头的时候解析出消息长度,然后向后读取该长度的内容。
2、设置定长消息,服务端每次读取既定长度的内容作为一条完整消息。
3、设置消息边界,服务端从网络流中按消息编辑分离出消息内容。
粘包问题及解决 https://www.cnblogs.com/zhouxuchong/p/11576275.html
48. 一台机器最多可以建立多少tcp连接?
链接:https://www.nowcoder.com/questionTerminal/997f45dddc9b4c8ea7da76288aa439d1
来源:牛客网
client最大tcp连接数
client每次发起tcp连接请求时,除非绑定端口,通常会让系统选取一个空闲的本地端口(local port),该端口是独占的,不能和其他tcp连接共享。tcp端口的数据类型是unsigned short,因此本地端口个数最大只有65536,端口0有特殊含义,不能使用,这样可用端口最多只有65535,所以在全部作为client端的情况下,最大tcp连接数为65535,这些连接可以连到不同的server ip。
server最大tcp连接数
server通常固定在某个本地端口上监听,等待client的连接请求。不考虑地址重用(unix的SO_REUSEADDR选项)的情况下,即使server端有多个ip,本地监听端口也是独占的,因此server端tcp连接4元组中只有remote ip(也就是client ip)和remote port(客户端port)是可变的,因此最大tcp连接为客户端ip数×客户端port数,对IPV4,不考虑ip地址分类等因素,最大tcp连接数约为2的32次方(ip数)×2的16次方(port数),也就是server端单机最大tcp连接数约为2的48次方。
实际的tcp连接数
上面给出的是理论上的单机最大连接数,在实际环境中,受到机器资源、操作系统等的限制,特别是sever端,其最大并发tcp连接数远不能达到理论上限。在unix/linux下限制连接数的主要因素是内存和允许的文件描述符个数(每个tcp连接都要占用一定内存,每个socket就是一个文件描述符),另外1024以下的端口通常为保留端口。
对server端,通过增加内存、修改最大文件描述符个数等参数,单机最大并发TCP连接数超过10万 是没问题的,国外 Urban Airship 公司在产品环境中已做到 50 万并发 。在实际应用中,对大规模网络应用,还需要考虑C10K 问题。
参考:
http://wanshi.iteye.com/blog/1256282
49. IO多路复用(select,poll,epoll的区别)(搜狗面试)
聊聊IO多路复用之select、poll、epoll详解 https://www.jianshu.com/p/dfd940e7fca2
50. 有没有抓过TCP包,描述一下
tcpdump是对网络上的数据包进行截获的包分析工具,它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来去掉无用的信息。
只能抓取流过本机的包
tcpdump -c 10 -nn -i eth0 tcp dst port 22 //这里 src是源 dst是目的的意思
51. 一个ip配置多个域名,靠什么识别?
靠http中的host段来完成,服务器根据host将请求转发到指定的主机上。
52. 服务器攻击(DDos攻击)
分布式拒绝服务攻击,强调是将多个计算机联合起来作为攻击平台,对一个或多个目标发动DDoS攻击,从而成倍地提高拒绝服务攻击的威力。大量恶意的流量去访问同一个服务器,导致服务器处理不过来,功能瘫痪。