面试八股文-网络编程_tcp客户端传输的数据服务器能读多次吗-程序员宅基地

技术标签: udp  面试  网络  Interview  

网络编程

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.com,sports.qq.com)
  • 本地域名服务器返回查到的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) 如果已经建立了连接,但是客户端出现了故障怎么办?

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并发网络库有哪些?

  • asyncio: 内置的并发网络库. 基于原生协程,只有调用await asyncio.sleep()才会切换协程,遇到其它IO操作不会切换协程
  • gevent: 第三方并发网络库,基于greenlet协程,使用monkey_patch()后,遇到IO操作基本都会自动切换协程
  • tornado: 既是一个并发网络库,也是web服务框架,基于IO多路复用实现的单线程并发

TCP 粘包

多个TCP数据包传输的数据内容合在了一起,没办法区分数据边界

  • 发送方两次send()的时间间隔过短,TCP会用Nagle算法把它们的数据内容合在一起
  • 接收方没及时用recv()接收缓冲区的包,导致多个TCP包的数据内容合在了一起

如何解决?

  • 采用请求-应答模式,每次都一发一收
  • 自定义消息格式: 包头 + 包体,包头是一个4字节整数,记录包体长度,每次先收4字节,读出包体长度,再收取对应字节的数据就是包体

如何理解TCP的有状态 和 HTTP的无状态

TCP有状态,是指它不同的请求之间都是有关联的,比如序号seq是递增的,而且它能够记住和它相连的主机的IP和端口

HTTP无状态,是指它不同请求之间是独立的,而且它不会记住刚刚登录的用户

HTTP状态保持

HTTP本身是无状态的,从而导致用户登录之后,下次发送请求还要携带账号密码进行身份验证

所以为了让HTTP有状态,需要额外引入一些机制,记录浏览器和服务端的会话状态

常用的方案有三种: session,cookie,token

Session和Cookie的区别

都是为了让HTTP实现状态保持

  • cookie数据一般保存在浏览器缓存中,可以被篡改,不安全, 发送请求时由于要携带cookie,会消耗更多带宽
    • cookie是服务器委托浏览器存储的一些数据,一般用于保存用户名,购物车等信息
  • session数据一般保存在服务器内存中,当访问量大时,服务器内存压力大
    • 当有多台服务器时,多次请求很可能落到不同的服务器上,使得状态保持失效,不利于分布式服务器进行负载均衡处理

Session,Cookie,Token的原理

  • Cookie: 用户登录后,服务端委托浏览器把用户信息存储在cookie中,客户端每次发起请求时要携带这个cookie,服务端接收请求时从cookie中取出用户信息,就知道是哪个用户了. 但是服务端无法检测Cookie是否被篡改,所以不安全
  • Session: 用户登录后把用户信息保存到服务器内存中,并返回一个sessionid让浏览器设置到cookie中,浏览器之后每次发起请求都携带cookie,服务端收到请求后取出cookie中的sessionid,再从内存中取出与之对应的用户信息,就知道是哪个用户了. 但是当用户增多时,服务器内存压力会很大.
  • Token: 用户登录后,服务端会签发一个token发给客户端,客户端收到后把token放到cookie或LocalStorage,之后每次向服务端请求资源时都要携带token,服务端收到后验证token,就知道是哪个用户了. 服务端可以检测到token是否被篡改,比较安全

衡量服务器性能的三大指标

  • 吞吐量 (requests per second): 每秒的请求次数,简称RPS 或 TPS,QPS
  • 并发数 (concurrency): 服务器能同时支持的客户端数量
  • 响应时间 (time per request): 服务器的处理能力

HTTP请求头字段

Host: 指定服务器的域名

Connection: 常用于要求服务端使用TCP长连接,HTTP/1.1默认是长连接,但为了兼容老版本设置此字段,一般都是Keep-Alive

Content-type: 告诉对方本次数据的格式,如image/png

Accept: 声明自己可以接受哪些数据格式,*/*代表接受任意类型

Accept-Encoding: 声明自己可以接受哪些压缩方法,如gzip,deflate

User-Agent: 描述客户端是哪个浏览器或者是爬虫

HTTP响应头字段

Content-length: 数据长度

Content-type: 告诉对方本次数据的格式,如image/png

Content-encoding: 返回的数据使用的压缩格式,如gzip

Date: 服务器的响应时间

Server: web服务器的名称和版本号

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_38992249/article/details/120886081

智能推荐

gitlab-ci 持续集成之gitlba-runner安装_gitlba jekens-程序员宅基地

官方文档: https://docs.gitlab.com/runner/install/index.html#doc-navLinux: 1,下载gitlab-runner # Linux x86-64 sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-down..._gitlba jekens

Springboot+jpa多数据源-程序员宅基地

修改配置文件spring: application: name: cms primaryDataSource: dataSourceClassName: com.mysql.jdbc.jdbc2.optional.MysqlDataSource url: jdbc:mysql://localhost:3306/srbairun?useUnicode=true

前端面试题2021及答案-程序员宅基地

身为三本的我就是凭借这些前端面试题拿到百度京东offer的,前端面试题2021及答案...此文转载自:https://blog.csdn.net/qq_33277654/article/details/112758362#commentBox点进来之后你的噩梦就要来了,接下来你要面对上百道面试题,那么,如果你——是个小白菜: 推荐使用2~3周的时间来消化接下来的面试题, 遇到不会的没听说过名词请立刻去搜; 文章中只是简答,如果想要详细了解的话还需要你自觉去搜索 如果你._前端面试题

(1.5.2.3)编程之美 寻找发帖水王 扩展问题-程序员宅基地

编程之美中的“寻找发帖水王”描述的是这么一个问题,有一个ID列表,其中有一个ID(水王的ID)出现的次数超过了一半,请找出这个ID。书中的思路是每次从列表中删除两个不同的ID,不影响“水王的ID在剩余ID中仍然超过一半”这一事实,因此每次删除两个不同的ID,直到剩下的所有ID都相同,那么剩下的就是水王的ID。具体编程的时候,使用一个candidate记录当前猜测的水王ID,

MapReduce技术的初步了解与学习-程序员宅基地

MapReduce技术的初步了解与学习--包含Google MapReduce中文版 今天咱们学习下MapReduce模型。由于是本人是初次接触,不是很了解。所以,有任何问题,还望各位不吝批评指正。本文中,我会先用最最通俗的语言阐述什么是MapReduce,然后再摘自Google MapReduce中文版上的一些内容,以期对这个模型有个初步的了解与认识。ok,闲不多说,下面进入...

keras从入门到放弃 (一) 线性回归_keras添加regression head-程序员宅基地

什么是keras中文 https://keras.io/zh/英文 https://keras-cn.readthedocs.io/en/latest/与其他任何深度学习框架相比,Keras 在行业和研究领域的应用率更高(除 TensorFlow 之外,且 Keras API 是 TensorFlow 的官方前端,通过 tf.keras 模块使用)。简单的线性回归Keras..._keras添加regression head

随便推点

惠普打印机故障代码_惠普打印机常见故障解决办法【图文详解】-程序员宅基地

Hp打印机,也就是我们常说的惠普打印机,目前已经成了打印机行业中的最为人们熟知的品牌之一,不过对于大多数打印机来说,无论品牌好坏,总会在使用的过程中出现这样那样的问题,而惠普打印机在使用过程中是故障率也是居高不下,如此看来掌握一定的维修技巧就显得十分必要了。今天小编就为大家总结几种惠普打印机常见的故障解决办法:1、打印时显示遇到DOT400X端口错误这种情况大多是由于USB端口出现了问题,要么是没..._惠普打印机故障编码

水务公司太恶心了!!!-程序员宅基地

昨天比较郁闷,家里的水给停了。在楼下发现了一张欠费单,原因是欠了水务公司半年的水费。无奈,只好联系房东(因为欠水费的时间段发生在我住进来之前),房东也比较恶心,昨天满口答应今天过来,又放鸽子了 (房东这人一向比较恶心,总爱放鸽子)。继续无奈,为了今天能用上水只好自己亲自前往水务公司缴债!到了以后更是奇怪,那的工作人员居然冒出一句“这是以前的单子。。。”,我日啊。。。就这么一张破

考研数据结构之线性表(1.7)——练习题之求差集A-B(C表示)_差集例题-程序员宅基地

题目已知递增有序的单链表A、B(A、B中元素个数分别为m、n,且A、B都带有头结点)分别存储了一个集合,请设计算法,以求出两个集合A和B的差集A-B(仅由在A中出现而不在B中出现的元素所构成的集合)。将差集保存在单链表A中,并保持元素的递增有序性。分析只需从A中删去A与B中共有的元素即可。由于两个链表中的元素是递增有序的,因此可以这么做:设置两个指针p、q开始时分别指向A和B的开始结点。循环进行以下判断和操作:如果p所指结点的值小于q所指结点的值,则p后移一位:如果q所指结点的值小于p所指结.._差集例题

c语言七巧板编程实验报告,哈工大电子信息工程学院单片机软件实验报告2016-张迎新版.docx...-程序员宅基地

姓名:学号:班级:同组人:指导老师:报告日期:软件设计实验1:清零实验? 实验目的:掌握汇编语言设计和调试方法? 实验内容:使用AT89C52单片机对单片机内部RAM进行清零操作,实验内容如下:把90H-AFH勺内容置为#55H;把90H-9FH的内容清零。? 实验问答:清零之后,90H-9FH的内容是什么? A0H-AFH的内容是什么? 清零之后,90H-9FH的内容是#00H; A0H-AFH..._七巧板实验报告

Python也可以拥有延迟函数_python 有没有defer-程序员宅基地

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar_python 有没有defer

OTP算法-程序员宅基地

简介OTP全称是One-Time-Password,也称动态口令,是根据专门的算法每隔一定时间(例如:60秒)生成一个与时间相关的、不可预测的随机数字组合,每个口令只能使用一次,每天可以产生43200个密码。它使用密码技术实现的在客户端和服务器之间通过共享秘密的一种认证技术,是一种强认证技术,是增强目前静态口令认证的一种非常方便的技术手段,是一种重要的双因素认证技术。认证原_otp算法

推荐文章

热门文章

相关标签