⾯试⼋股⽂-⽹络编程
⽹络编程
TCP/IP协议栈四层模型
应⽤层: 负责为⽤户提供应⽤功能
HTTP,DNS,SSH,FTP,SMTP
传输层: 负责进程与进程之间的通信
TCP,UDP
⽹络层: 负责⽹络包的分⽚,路由
ARP,RARP,DHCP,NAT,ICMP
⽹络接⼝层: 负责⽹络包在物理⽹络上的传输
PPP
OSI七层模型
从下往上: 物理层,数据链路层,⽹络层,传输层,会话层,表⽰层,应⽤层
常⽤协议及作⽤
应⽤层:
HTTP: 在互联⽹两点之间传递超⽂本的规范
DNS: 把域名解析为IP地址
传输层:
TCP: 传输控制协议
UDP: ⽤户数据报协议
⽹络层:
ARP: 即地址解析协议,由IP地址获取MAC地址
RARP: 由MAC地址,获取IP地址
DHCP: 动态获取IP地址
NAT: 实现 内⽹IP与外⽹IP 的相互转换,缓解外⽹IP的消耗
ICMP: 告知⽹络包传送过程中产⽣的错误信息
TCP 和 UDP的区别
1. TCP需要先与对⽅建⽴连接才能发送数据,⽽且接收⽅收到后必须响应,发送⽅收到响应后这个数据包才算传输完成,所以它安全可
靠,能保证数据不丢失不重复; UDP不⽤事先建⽴连接就可以任意收发数据,传输效率⾼,但不能保证数据⼀定送达; 所以TCP⼀般⽤于⽹上购票,传输⽂件这种对稳定性要求较⾼的场景,⽽UDP⼀般⽤于实时视频会议这种对传输效率要求较⾼的场景
2. TCP只⽀持⼀对⼀; UDP⽀持⼀对⼀,⼀对多,多对多的交互通信
3. TCP报⽂不限制最⼤长度,⼀次发送可以分多次接收; UDP报⽂的最⼤长度为65535个字节,分⼏次发送就必须分⼏次接收,⼀个⼤
报⽂只要丢了⼀个分⽚,整个UDP报⽂都会被丢弃
DNS查询的过程(域名解析)
浏览器查看⾃⾝缓存
操作系统缓存
本机hosts⽂件
本地域名服务器
根域名服务器
顶级域名服务器(com)
权威域名服务器(qq,sports.qq)
本地域名服务器返回查到的IP给浏览器
浏览器输⼊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. 浏览器收到后解析响应报⽂,渲染输出页⾯
集线器,交换机,路由器的区别
1. 集线器⼯作在物理层,通过⼴播的形式转发数据,实现局域⽹内设备的连接,只能半双⼯通信
2. 交换机⼯作在数据链路层,通过MAC地址转发数据,实现局域⽹内设备的连接,是全双⼯通信
3. 路由器⼯作在⽹络层,通过IP地址转发数据,实现了不同⽹络之间的连接
TCP三次握⼿
[外链图⽚转存失败,源站可能有防盗链机制,建议将图⽚保存下来直接上传(img-zAwg8OQk-1630134046911)(⾯试⼋股
⽂.assets/image-20210706084255418.png)]
第⼀次握⼿时,客户端发送⼀个SYN报⽂给服务端,⾃⾝进⼊SYN_SENT状态
第⼆次握⼿时,服务端发送⼀个SYN报⽂给客户端,⾃⾝进⼊SYN_RCVD状态
第三次握⼿时,客户端发送⼀个ACK报⽂给服务端,客户端进⼊ESTABLISHED状态, 服务端收到后会创建⼀个新的TCP套接字⽤于和此客户端通信, 这个套接字也进⼊ESTABLISHED状态
(1) 为什么不能两次握⼿?
只有三次握⼿才能确保双⽅的发送和接收都是正常的,如果是两次握⼿的话,不能确保服务端发送正
常,客户端接收正常,三次握⼿还可以防⽌已经失效的请求后来才传送到服务器,导致再次建⽴连接浪费服务器资源
(2) 如果已经建⽴了连接,但是客户端出现了故障怎么办?java面试八股文
TCP设有⼀个保活计时器,⼀般定时为2⼩时,如果期间收到客户端的请求就会重新开始倒计时,当服务端超过2⼩时未收到客户端的任何请求,服务端就会发送探测报⽂,没有响应就会认定客户端出现故障,从⽽断开连接
TCP四次挥⼿
第⼀次挥⼿: 假设是客户端先发起断开连接的请求,客户端发送⼀个FIN报⽂给服务端,⾃⾝进⼊FIN_WAIT_1状态
第⼆次挥⼿: 服务端发送⼀个ACK报⽂给客户端,⾃⾝进⼊CLOSE_WAIT状态, 客户端收到后进⼊FIN_WAIT_2状态, 在此期间服务端可以继续向客户端发送数据
第三次挥⼿: 服务端发送⼀个FIN报⽂给客户端,⾃⾝进⼊LAST_ACK状态
第四次挥⼿: 客户端发送⼀个ACK报⽂给服务端,⾃⾝进⼊TIME_WAIT状态,等待2*MSL的时间进⼊CLOSED状态,服务端收到ACK 报⽂后进⼊CLOSED状态
(1) 为什么中间的两次挥⼿不合并为⼀次?
因为客户端想断开连接的时候,服务端如果还有数据要发给客户端,就要先发⼀次ACK报⽂,告知客户端"我知道你想断开了". 然后服务端给客户端发送数据,等数据发完服务端再发送FIN报⽂. 抓包时发现, 若服务端没有数据要发给客户端, 中间的两次挥⼿会合并为⼀次
(2) 为什么TIME_WAIT状态要经过2MSL才进⼊CLOSED状态?
如果最后⼀个ACK报⽂发出后丢失了,服务端就会再次发送FIN报⽂,所以客户端收到第⼆次FIN报⽂的时间最长是2MSL,此时如果客户端直接进⼊CLOSED状态,就⽆法再重发最后⼀个ACK报⽂,导致服务端⽆法进⼊CLOSED状态. 如果设置这样⼀个时间段,客户端在此期间没有收到FIN报⽂,说明服务端成功收到最后⼀个ACK报⽂
TCP如何保证可靠通信?
校验和: TCP头有校验和字段,检测数据传输过程中是否有差错,若有则丢弃
超时重传: 发送⽅在规定的时间内没有收到确认就要重传之前发送的报⽂
还有 流量控制 和 拥塞控制
正向代理和反向代理
正向代理: 是客户端的代理,代替客户端发起⽹络请求
可以对外隐藏客户端信息,保护⽤户隐私
可以访问客户端⽆法访问的资源,如国内访问⾕歌需要先连接⼀个正向代理服务器
反向代理: 是服务端的代理,代替服务端接收⽹络请求
可以对外隐藏服务端信息,防⽌内⽹的服务器被攻击
可以实现负载均衡,把访问压⼒分散到多个服务器上
GET和POST的区别
GET⽤于从服务器获取数据,POST⽤于向服务器提交数据
GET请求是安全且幂等的,多⽤于查询操作
POST请求既不安全也不幂等,多⽤于注册操作
注: 安全指的是 请求⽅法不会修改服务器的资源,幂等指的是 多次请求返回的结果都相同
常⽤的HTTP状态码
1xx: 提⽰信息,表⽰现在是协议处理的中间阶段,还有后续操作
2xx: 成功,报⽂已经收到并被正确处理
200: OK,请求成功
204: No Content,请求成功,但响应体为空
206: Partial Content, 请求成功,但响应体只有⼀部分数据
3xx: 重定向,资源位置变动
301: Move Permanently,请求的资源不存在,需要⽤另⼀个URL访问
302: Found,请求的资源存在,需要⽤另⼀个URL访问
304: Not Modified,请求的资源未修改,让客户端⾃⼰缓存⽂件
4xx: 客户端请求报⽂有误
400: Bad Request,客户端请求报⽂有错误
401: Unauthorized,客户端⾝份认证不通过
403: Forbiden,拒绝执⾏客户端的请求
404: Not Found,不到客户端请求的资源
405: Method Not Allowed,请求⽅法不被允许
5xx: 服务器错误
500: Internal Server Error,服务器处理请求时出错
501: Not Implemented,请求的功能暂不⽀持
502: Bad Gateway,反向代理服务器出错
503: Service Unavailable,服务器繁忙,⽆法响应
HTTP的特点(优缺点)
1. 简单灵活可扩展,报⽂基本格式都是 起始⾏+header+body
2. 可靠传输,HTTP是基于TCP协议的
3. 跨语⾔跨平台,不限定某种编程语⾔或操作系统
4. ⽆状态,每个请求都是互相独⽴的. 好处是可以通过负载均衡把请求转发到任意⼀台服务器,坏处是每次请求都要验证⾝份信息
5. 请求-应答模式,客户端主动发起请求,服务端被动回复请求,效率较低,可能会发⽣队头阻塞
6. 明⽂传输,如果连上钓鱼wifi,流量被截获保存,可能会泄漏⾃⼰的账号密码等信息
7. 不安全,⽆法判断报⽂在传输过程中是否被篡改
HTTP/1.1的特点(优缺点)
使⽤长连接,减少了频繁建⽴与断开连接的开销
可以连续发送多个请求,减少了整体的等待时间
如果前⾯的请求响应特别慢,会阻塞后⾯的所有请求(队头阻塞)
以⽂本格式传输header,有严重的数据冗余
明⽂传输,不安全
HTTP/2的特点
头部压缩
报⽂以⼆进制格式传输
⽀持服务端主动向客户端发送消息
使⽤数据流全双⼯通信,解决了队头阻塞问题
⽀持请求优先级,让服务端优先处理重要资源,优化⽤户体验
HTTP 与 HTTPS的区别
HTTP是明⽂传输,不安全; HTTPS在传输层和应⽤层之间加了TLS层,使得报⽂能加密传输
HTTP端⼝是80,HTTPS端⼝是443
HTTPS在TCP三次握⼿后还要进⾏TLS握⼿
HTTPS是如何保证安全的?
混合加密,解决了窃听的问题
摘要算法,解决了篡改的问题
将服务端公钥放到数字证书中,解决了冒充的问题
HTTPS TLS握⼿过程
[外链图⽚转存失败,源站可能有防盗链机制,建议将图⽚保存下来直接上传(img-MTlyMzrG-1630134046913)(⾯试⼋股
⽂.assets/image-20210630142543078.png)]
HTTPS,HTTP/2,WebSocket分别解决了HTTP的什么问题?
HTTPS: 加密传输,保证安全通信
HTTP/2: 解决队头阻塞
WebSocket: 不再使⽤“请求-应答”模式,⽽是全双⼯实时通信
什么是IO多路复⽤?
IO多路复⽤中,多路指的是有多个⽂件描述符fd,复⽤指的是⽤⼀个线程来处理。它实现了⽤⼀个线程监视多个fd,⼀旦有fd就绪,select, epoll这些系统调⽤就会返回,⽤户态线程就可以对这些就绪的fd进⾏相应的读写操作。
它的效率很⾼,因为它由操作系统内核帮我们出就绪的fd,使得我们不必轮询每个fd的read()函数,从⽽避免了频繁切换上下⽂同步异步阻塞⾮阻塞 IO的区别?
同步IO: 调⽤IO函数后等待结果返回
异步IO: 调⽤IO函数后直接返回,等IO完成后会⾃动调⽤回调函数
阻塞IO: 在等待IO结果返回时,会主动让出CPU时间⽚,进⼊阻塞态
⾮阻塞IO: 在等待IO结果返回时,不断轮询直到收到结果
select,poll,epoll的区别?
select只知道有fd就绪,但不知道具体是哪⼏个,需要⽤户⾃⼰遍历到就绪的fd
poll本质上和select没有区别,但是它去除了select只能监听1024个fd的限制
epoll会直接返回已就绪的fd,但是它只能在Linux操作系统上⽤
python并发⽹络库有哪些?
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论