面试--网络编程
1、TCP/IP协议四层模型
应用层:负责为用户提供应用功能
协议:HTTP,DNS,SSH,FTP,SMTP
传输层:负责进程与进程之间的通信
协议:TCP,UDP
网络层:负责网络包的分片,路由
协议:ARP,RARP,DHCP,NAT,ICMP
网络结构层:负责网络包在物理网络上的传输
协议:PPP
2、OSI七层模型
应用层
表示层
会话层
传输层
网络层
数据链路层
物理层
3、常用协议和作用
应用层:
HTTP:在互联网两台设备之间传递超文本的规范
DNS:把域名解析为IP地址
传输层:
TCP:传输控制协议
UDP:用户数据包协议
网络层:
ARP:地址解析协议,由IP地址获取MAC地址
RARP:由MAC地址,获取IP地址
DHCP:动态获取IP地址
NAT:实现 内网IP与外网IP 的相互转换,缓解外网IP的消耗
ICMP:告知网络包传送过程中产生的错误信息
4、TCP和UDP的区别
1)TCP需要先建立连接,而且接收方收到后必须相应,发送方收到相应后这个数据包才算传输完成,所以它是可靠的,能保证数据不丢失不重复,
UDP不用先建立连接,它可以任意的发送数据,传输效率高,但是不能保证数据能到达,
所以TCP协议常应用于稳定性需求较高的场景,如购票系统、文件传输等,而UDP则应用于实时性比较高的场景,如视频会议等。
2)TCP仅支持一对一;而UDP不仅支持一对一,还支持一对多、多对多的交互通信。
3)TCP报文不限制最大长度,一次发送可以分多次来接收;UDP报文的最大长度为65535个字节,分几次发送就必须分几次接收,一个大报文只要丢了一个分片,整个UDP就都会被丢弃
5、DNS查询的过程(域名解析)
1)浏览器查看自身缓存
2)操作系统缓存
3)本机hosts文件
4)本地域名服务器
根域名服务器
顶级域名服务器(com)
权威域名服务器(qq.com,sports.qq.com)
5)本地域名服务器返回查到的IP给浏览器
6、浏览器输入url中间经历的过程
1)浏览器从地址栏的输入中解析url,获取web服务器的IP地址和端口号
2)浏览器通过三次握手与web服务器建立TCP连接
3)浏览器发送HTTP请求报文,这个报文会一次加上TCP头,IP头,MAC,组成一个完整的数据包
4)数据包经过网卡转换为电信号,在网线上传输,中途要经过很多次交换机和路由器
5)经过路由器,路由器会查询路由表来确定下一跳IP,一直转发到与目标IP同一网段的路由器
6)这个路由器会查ARP表获取目标IP服务器的MAC地址,然后 通过某个端口转发给web服务器
7)web服务器收到数据包后,会依次拆开MAC头,IP头,TCP头,然后把HTTP请求报文监听给指定端口的服务器端进程
8)服务端进程收到请求报文后处理请求,然后发送响应报文给浏览器
9)浏览器收到后解析响应报文,渲染输出页面
7、集线器、交换机和路由器的区别
1)集线器工作中物理层,通过广播的形式转发数据,实现局域网内设备的连接,只能半双工通信
2)交换机工作在数据链路层,通过MAC地址转发数据,实现局域网内设备的连接,是全双工通信
3)路由器是工作中网络层,通过IP地址转发数据,实现不同网络的通信
8、TCP三次握手和四次分手
9、TCP如何保证可靠通信
1)校验和:TCP头有校验和字段吗,检测数据传输过程中是否有差错,若有则丢弃
2)超时重传:发送方在规定的时间内没有时候收到确认则会重传之前的报文
3)流量控制
4)拥塞控制
10、正向代理和反向代理
1)正向代理:是客户端的代理,代替客户端发起网络请求
可以对外隐藏客户端信息,保护用户隐私
可以访问客户端无法访问的资源,如国内访问谷歌需要先连接一个正向代理服务器
2)反向代理:是服务器端的代理,代替服务器端接收网络请求
可以对外隐藏服务端信息,防止内网的服务器被攻击
可以实现负载均衡,把访问压力分散到多个服务器上
11、GET和POST的区别
1)GET是从服务器获取数据,POST用于向服务器提交数据
2)GET请求是安全且幂等的,多用于查询操作;POST请求既不安全也不幂等,多用于注册操作、
ps:
- 此处安全指的是:请求方法不会修改服务器的资源
- 此处幂等值的是:多次请求返回的结果都相同
12、HTTP协议详解
13、HTTP的优缺点
1)简单灵活可扩展
2)可靠传输,HTTP协议基于TCP协议
3)跨语言平台,不限定某种指定的编程语言或者操作系统
4)无状态,每个请求都是互相独立的,好处是可以通过负载均衡把请求转发到任意一台服务器,坏处是每次请求都要验证身份信息
5)请求-答应模式,客户端主动发起请求,服务端被动回复请求,效率极低,可能发生队头阻塞
6)明文传输,如果被钓鱼攻击,可能会泄漏账号密码等敏感信息
7)不安全,无法判断传输过程中报文是否被篡改
14、HTTP/1.1的优缺点
1)使用长连接,减少了频繁建立与断开连接的开销
2)可以连续发送多个请求,减少了整体时间的等待
3)如果前面IND请求相应特别慢,会阻塞后面的所有请求(队头阻塞)
4)以文本格式传输header,有严重的数据冗余
5)明文传输,不安全
15、HTTP/2的特点
1)头部压缩
2)报文以二进制格式传输
3)支持服务端主动向客户端发送消息
4)使用数据流全双工通信,解决了队头阻塞问题
5)支持请求优先级,让服务器优先处理重要资源,优化用户体验
16、HTTP与HTTPS的区别
1)HTTP是明文传输,不安全;HTTPS在传输层和应用层之间加了TLS层,使得报文能加密传输
2)HTTP的端口是80,HTTPS端口是443
3)HTTPS在TCP三次握手后还要进行TLS握手
17、HTTPS是如何保证安全的?
1)混合加密,解决窃听问题
2)摘要算法,解决篡改问题
3)将服务端的公钥放到数字证书中,解决了冒充的问题
18、HTTPS TLS的握手过程
HTTPS 详解二:SSL / TLS 工作原理和详细握手过程
19、HTTPS,HTTP/2,WebSocket分别解决了HTTP的什么问题?
1)HTTPS:加密传输,保证安全通信
2)HTTP/2:解决队头阻塞
3)WebbSocket:不再使用“请求-应答”模式,而是全双工实时通信
20、什么是IO多路复用
IO多路复用中,多路指的是有多个文件描述符fd,复用指的是都用一个线程来处理。它实现了用一个线程监视多个fd,一旦有fd就绪,select、poll或epoll这些系统调用就会返回,用户态线程就可以对这些fd进行相应的读写操作。
它的效率很高,因为它由操作系统内核帮我们找出就绪的fd,使得我们不必轮询每个fd 的read()函数,从而避免频繁的切换上下文。
21、同步、异步、阻塞、非阻塞 IO 的区别
1)同步IO:调用IO函数后等待结果返回
2)异步IO:调用IO函数后直接返回,等IO完成后会自动调用回调函数
3)阻塞IO:在等待IO结果返回时,会主动让出CPU时间片,进入阻塞态
4)非阻塞IO:在等待IO结果返回时,不断轮询,直到收到结果
22、select、poll、epoll的区别
1)select只知道有fd就绪,但不知道具体是哪几个,需要用户自己遍历找到就绪的fd
2)poll本质上好select没有区别,但是它去除了select只能监听1024个fd的限制
3)epoll会直接返回已就绪的fd,但是它只能在Linux操作系统上用
23、TCP粘包问题
多个TCP数据包传输的数据内容合在一起了,没办法区分边界,产生原因:
1)发送方两次send()的时间间隔太短,TCP会用Nagle算法把他们的数据内容合在一起
2)接收方没及时用recv()接收缓冲区的包,导致多个TCP包的数据内容合在一起
解决方法:
1)采用请求-应答模式,每次都一收一发
2)自定义消息格式:包头 + 包体,包头是一个4字节整数,记录包体长度,每次先手4字节,读出包体长度,再收取对应字节的数据就是包体
24、如何理解TCP的有状态和HTTP的无状态
1)TCP有状态:是指它不同的请求之间都是有关联的,比如序号seq(seq表示本次发送数据的偏移量,ack表示回复已经接收到的数据量)是递增的,而且它能够记住和它相连主机的IP和端口
2)HTTP无状态:是指它不同请求之间是独立的,而且它不会记住刚刚登录的用户
25、HTTP状态保存
HTTP本身是无状态的,从而导致用户登录之后,下次发送请求还要携带账号密码进行身份验证
所以为了让HTTP有状态,需要额外引入一些机制,来记录浏览器和服务端的会话状态:
1)sesson
2)cookie
3)token
26、Session和Cookie的区别
都是为了让HTTP实现状态的保持
1)cookie数据一般保存在浏览器缓存中,可以被篡改,不安全,发送请求时由于要携带cookie,会消耗更多宽带
cookie是服务器委托浏览器存储的一些数据,一般会用于保存用户名,购物车等信息
2)session数据一般保存在服务器内存中,当访问量大时,服务器内存压力大
当有多台服务器时,多次请求很可能会落到不同的服务器上,使得状态保持失效,不利于分布式服务器进行负载均衡处理
27、Session、Cokkie、Token 的原理
1)Cookie:用户登录后,服务端委托浏览器把用户信息存储在cookie中,客户端每次发起请求时要携带这个cookie,服务端收到请求时从cookie中取出用户信息,就知道是哪个用户了。
但是服务器无法检测 这个cookie是否被篡改,所以不安全。
2)Session:用户登录后将用户信息保存到服务器内存中,并返回一个ssesionid让浏览器设置到cookie中,浏览器之后每次发起请求都会携带cookie,服务端收到后取出cookie中的sessionid,再从内存中取出与之相对应的用户信息,这样就知道是哪个用户了。
但是当用户增多时,服务器内存压力会很大。
3)Token:用户登录后,服务端会签发一个token发给客户端,客户端收到后爸token放到cookie或LocalStorage(局部存储器),之后每次向服务端请求资源时都要携带token,服务端收到后验证tokne,就知道哪个用户了。
服务端可以检测到token是否被篡改,比较安全
28、衡量服务器性能的三大标准
1)吞吐量(requests per second):每秒请求次数,简称RPS,TPS,QPS
2)并发数(concurrency):服务器能同时支持的客户端数量
3)响应时间(time per request):服务器的处理能力
29、HTTP请求头和响应头
30、socket读写的简单过程
当客户端和服务端进行通信时,客户端封装一个请求对象req,将请求对象req序列化成字节数组,然后通过套接字socket将字节数组发送到服务器,服务器通过套接字socket读取到字节数组,再反序列化成请求对象req,进行处理,处理完毕后,生成一个响应对象res,将响应对象res序列化成字节数组,然后通过套接字将字节数组发送给客户端,客户端通过套接字socket读取到字节数组,在反序列化成响应对象。
31、什么是大、小端字节序
字节序:指数据在内存中的存放顺序,字节数大于1时需要考虑
1)大端字节序:高位字节放在内存的低地址端,低位字节放在内存的高地址端;
2)小端字节序:低位字节放在内存的低地址端,高位字节放在内存的高地址端;
32、主机字节序和网络字节序
现代PC大多(Mac OS 是大端字节序)采用小端字节序,小端字节序也称为主机字节序;
TCP/IP协议规定使用大端字节序作为网络字节序,所以需要发送端先转换为大端字节序然后发送,所以大端字节序也称为网络字节序;
即使是同一机器上的两个进程(如c和java编写的程序),也要考虑字节序的问题。
***原文地址***
https://blog.csdn.net/qq_38992249/article/details/120886081?spm=1001.2014.3001.5506