常用的基础网络知识(面试必会)
1. 当前应用系统主要分为两大类,一类:b/s (Browser/Server 浏览器 服务器),C/S (客户端/服务端),无论哪种架构,客户端都需要和远端的服务端进行网络通信,进行数据交互。
不仅客户端和浏览器和远端的平台侧需要网络通信,平台侧也部署了多台服务器,比如web服务器,业务服务器,集群服务器,负载均衡服务器,这些服务器之间也要进行网络通信。一旦通过网络进行通信,就会不可避免的出现各种的网络问题和网络故障。客户端与服务端之间可能有多台服务器和网络设备,比如DNS服务器,路由器,交换机,集线器等,一旦客户端与服务器出现问题,就需要逐步排查问题。
网络问题主要两大类: 一类客户端与服务端无法建立连接的问题,一类建立连接有网络延时或者严重丢包问题。
建立通信连接后,客户端与服务器之间收发的数据内容不正确等问题,可能和网络有关,也可能是业务上存在问题导致的。对于客户端无法和服务器建立连接,可能有多种原因:客户端与服务端之间的网络端口不通,服务器侧没有打开监听端口导致,也可能网络设备故障或者网络设备启动部分安全规则将数据包拦截了。对于网络延时和丢包问题,可能业务问题,也可能网络不稳定,也可能中间设备拦截数据导致的。
对于网络不稳定的场景:尽量有线代替无线
对于网络设备拦截数据包:网络设备设置了安全规则,拦截部分或全部的包
排查网络通信过程中遇到的一系列问题,需要掌握一些基础的网络知识,了解一些常用的网络命令,必要时抓包分析。
2.OSI7层开放式系统互联通信参考模型,一个试图使各种计算机在世界范围i内互连为网络的标准架构。分别为 物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。
TCP/IP称为传输控制协议/网际协议,实现网络互联的通信协议。基于TCP/IP的参考模型将协议分为4层,分别为应用层 传输层 网络层 物理链路层
3.数据入栈时的封装过程
经过传输层 加上TCP头部,经过网络层,加上IP头部;经过数据链路层,会加上以太网头。对于数据接收端,会按照反方向逐层剥离,最终到上层的数据就是发送端的数据。
4. 端口的概念
端口是TCP/UDP通信中的数字端口号,属于传输层的概念,是软件中的端口。端口号用整形数据表示,0-65535,要进行TCP/UDP通信时必须要有端口
默认端口 21ftp http 80 https 443
对于TCP先绑定端口,后开启对目标端口的监听
有些程序即使开了端口也可能连接不上,可能路由器或者防火墙禁用了端口
如何判断远程端口是否被监听?
Telnet 远程登陆协议 连接失败就是没开启监听端口
5.TCP建立连接时的三次握手
5.1TCP头的构成
TCP建立连接的过程就是三次握手的过程,三次握手成功完成,三次连接就完成了。TCP头的构成如下:
1)源端口和目的端口:源端口是该数据发送者的端口,目的端口是这包数据要发送的目的端口
2)序号:当前数据包序号SEq序号,用来标识从TCP源端向目的端发了多少字节的数据,发起方发送数据时对此进行标记。
3) 确认号:ACK 序号,只有ACK为1 确认该字段有效,在TCP中,接收端收到发送端发来的数据后客户端返回一个ACK确认包,确认收到了,这就是TCP的ACK机制
4)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等
5.2三次握手的流程说明:
TCP的三次握手,是指建立一个TCP连接,客户端和服务器一共发送3个包完成连接的建立。目的是 连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认好并交换TCP窗口大小信息等。
第一次握手: 客户端发送一个TCP的SYN标志位置为1的包,指明要连接服务器的端口,并将包的序号设置为1
第二:服务端收到客户端发来的SYN包,给客户ACK确认包,并将SYN和ACK标志为中设置为1,并将ACK的确认号设置为1
第三次握手:客户端收到服务器的ACK包,客户端给服务端发送一个ACK确认包,保正SYN标志位设置为0,ACK位置为1,并把包中的SEQ,ACK号设置为1
服务端收到后客户端发来的ACK包后,TCP连接建立了,连接就变成了已建立状态
如果失败返回 RST包 一般都是端口问题引起的
5.3 为什么必须使用3次握手,不使用两次握手去建立连接
三次握手的好处:
1.三次握手确认双方的接收和发送能力正常,同步连接双方的初始化序列号ISN,为后面的可靠性传输做准备。而两次握手只有服务端对客户端的起始序列号做了确认,但客户端对服务端得到初始序列号没有确认,不能保证传输的可靠性。
2.三次握手可以防止已失效的连接请求报文段突然又传送到了服务端,导致服务器错误链接,浪费资源。
如果客户端发出的第一个连接请求报文并没有丢失,而是在某个网络节点长时间滞留了,以致延误到连接释放后的某个时间才到达服务器侧。本来这是一个早已失效的报文,但服务器收到此失效连接后:
1)假设不采用3次握手,只要Server发出确认就链接,由于现在Client并没有建立连接的请求,因此不会理睬,也不会发送数据。而Server却因为连接已经建立,并且等待发送数据,这样很多的资源就白白浪费掉了。
2) 而采用三次握手协议,只要没有client的确认,就直到client并没有连接请求,就不会建立连接。
5.4SYN包攻击简介
SYN包攻击是指利用TCP需要三次握手的特性,攻击者伪造SYN报文向服务器发起连接,
服务器在收到报文的时候用ACK应答,但攻击者收到应答后就不在响应,造成一个半连接。如果发送大量的报文,攻击主机会造成大量的半连接,服务器连接有线的,最终服务器连接资源耗尽,导致正常的SYN请求因为队列满而被丢弃,使正常用户无法访问。
6.TCP和UDP的区别
1.TCP是可靠传输 UDP是不可靠传输
TCP是面向连接的,需要建立连接后才能收发数据,TCP在收发数据时有ACK机制,即数据接收方收到数据后会给数据发送方回一个ACK确认包,表示已经收到对方的数据,如果数据发送方没收到ACK包就会触发丢包重传机制,所以TCP可靠的
UDP不需要建立连接,可以直接收发数据,没有收发数据的ACK机制,所以UDP不可靠。
2.TCP有序 UDP无序
网络层的ip协议不能保证数据的有序收发,所以数据接收端的ip协议层收到的网络数据都可能是乱码,无论TCP还是UDP,之所以TCP有序,是因为数据达到TCP协议会将乱序的包按照前后的顺序进行重组,即排好顺序在投递给应用层。
UDP协议没有对数据包进行重新排序,所以经过后仍然是乱序的
3. 其他也有一些区别
TCP首部长度20字节 UDP是8字节
TCP有拥塞控制的流量控制 UDP没有
TCP全双工通信 但不能广播或者多播;UDP提供广播或者多播
6.2TCP与UDP的使用场景
TCP是可靠的,对要求数据准确无误的发送给对方场景需要选择TCP,比如软件控制指令。
UDP没有数据的ACK,直接发送数据,实时性好,对实时性要求较高对可靠性要求不太高的场景一般选择UDP。比如聊天中的音视频。
6.3 使用TCP和UDP的常用协议
TCP是可靠的,能将数据准确无误的传递给对方,一般处理文件传输的HTTP,HTTPS,FTP协议,用于发送和接收邮件的POP3,SMTP等邮件传输协议,使用的都是TCP。对实时性要求较高且对可靠性要求较低的协议则使用UDP。
TCP对应的协议:
FTP:文件传输协议,默认21端口
Telnet: 远程终端接入,默认23端口,用户可以自己身份连接到计算机上,可提供基于DOS模式下的通信服务
SMTP:邮件传送协议,用于发送邮件,默认25端口
POP3:邮件传送协议,P用于接收邮件,默认使用110端口
HTTP:80端口
UDP对应协议:
DNS域名解析服务 53
SNMP:网络管理协议 161
DHCP: 动态主机配置
7.TCP的心跳检测机制和 丢包重传机制
心跳检测和丢包重传机制是TCP的两个特性,其中丢包重传机制也是保证可靠传输的一种机制。
7.1心跳检测机制
TCP心跳检测是通过定时在链路上发心跳包去保持链路的活性,这样链路中的网络设备就不会因为链路上有段时间没有数据在跑,将链路强行断开了。
以上是TCP/IP协议栈的心跳机制,有时我们应用层会添加一个应用层的心跳检测,比如客户端可以给服务器发心跳包,根据服务器的回应情况来判断服务器是否活着,客户端和服务器之间的网络是否出现问题,如果检测异常,客户端会主动断开与服务器的连接。
7.2丢包重传机制
对于TCP连接,数据发送方将数据发出去后,会启动一个定时器,等待接收端回ACK确认包,如果在指定时间没有收到,就会触发丢包重传机制。如果重发包还是没收到ACK,下一次的重传时间间隔会加倍,当重传次数达到上限后,协议栈就认为网络故障了,协议栈直接关闭连接。
8.常用的网络命令
8.1 ping命令
当无法连接到远端的地址及端口时,最先想到ping一个远端地址,看网络是不是通的。软件系统出现抖动或者延时,可以在ping指令后面加上一个参数 -t 如果停止CTRL+C
8.2 telnet命令
telnet命令其实对应的是telnet客户端程序,程序使用telnet协议。远程登陆服务的标准协议和主要方式,为用户提供从本地计算机登陆远程主机的能力
使该命令可以检查端口与没有开启监听
8.3 ipconfig命令
ipconfig 命令主要查看网卡的配置信息,比如ip地址 ,子网掩码和默认网关
ipconfig/all ipconfig/flushdns 清除系统中的DNS缓存
8.4 netstat命令
netstat 查看本机的网络连接与端口占用情况
8.5 route命令
route add route delete
8.6 arp命令
显示和修改地址解析协议(ARP)使用的ip到物理地址转换表
8.7 tracert 到目标地址的所有访问节点