计算机网络面试整理

本文深入讲解网络通信原理,涵盖DNS解析、TCP/IP协议、HTTP/HTTPS工作流程,以及HTTP协议的发展历程,从HTTP0.9至HTTP2.0。解析三次握手与四次挥手过程,探讨Socket的工作机制,对比GET与POST请求的区别,详解HTTP响应状态码。

一. 在浏览器地址栏键入URL,按下回车之后经历的流程?

(1)DNS解析 (2)TCP连接 (3)发送HTTP请求 (4)服务器处理请求并返回HTTP报文 (5)浏览器解析渲染页面 (6)连接结束
首先,浏览器会根据URL的组成,查询DNS服务器缓存,解析URL中域名所对应的IP地址;然后经历三次握手,建立TCP连接;浏览器发送读取文件请求(HTTP);服务器处理请求并返回HTTP报文;浏览器解析渲染页面;最后,浏览器释放TCP连接,经过4次挥手,连接结束。

  • DNS解析?

  • TCP连接?

    • 三次握手,四次挥手及其原因

    • time-wait状态,时长(2TSL?),数据帧存活时间

    1.DNS域名解析:通过域名找到IP地址,本地域名缓存;域名服务器查询IP地址

    2.发出http请求(get,post)

    3.通过TCP建立连接

    time-wait(2MSL):数据帧存活时间,2个的原因,1.确认ACK能回传到服务器2.(没收到ACK)避免新旧连接混淆(没收到ACK,再来一个连接请求,序列号错乱)或确保数据传送到客户端

二.TCP三次握手&四次挥手

img
  • 三次握手:

    • 客户端发送SYN(syn=j)包到服务器,并进入SYN-SEND状态,等待服务器确认;
    • 服务器收到SYN包,确认客户端的SYN(ack=j+1),同时发送一个SYN(syn=k)包,即SYN+ACK包,服务器进入SYN-RECV状态;
    • 客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端服务端进入ESTABLISHED状态,完成三次握手。

    为什么需要三次握手?
    答:首次握手隐患,SYN超时:Server收到Client的SYN,回复SYN-ACK的时候,未收到ACK确认,Server不断重试直至超时。(SYN-Flood防护:SYN Cookie)

  • 四次挥手:

    • 客户端发送一个FIN,用来关闭客户端到服务器的数据传送,客户端进入FIN-WAIT-1状态;
    • 服务器收到FIN后,发送一个ACK给客户端(确认序号为收到序号加1),服务器进入CLOSE-WAIT状态;
    • 服务器发送一个FIN,用来关闭服务器到客户端的数据传送,服务器进入LAST-ACK状态;
    • 客户端收到FIN后,客户端进入TIME-WAIT状态,接着发送一个ACK给服务器(确认序号为收到的序号加1),服务器进入CLOSED状态,完成四次挥手。

    为什么会有TIME-WAIT状态?

    • 确保有足够的时间让对方(服务器)收到ACK包
    • 避免新旧连接混淆

    为什么需要四次挥手才能断开连接?

    • 因为全双工,发送方和接收方都需要FIN报文和ACK报文

    服务器出现大量CLOSED-WAIT状态的原因?

    • 对方关闭socket连接,我方忙于读或写,没有及时关闭连接。(检查释放资源代码;检查处理请求的配置。netstat)

三. IP&TCP&UDP

  • IP协议非常简单,仅仅提供不可靠、无连接的传输服务。IP协议的主要功能有:无连接数据报传输、数据报路由选择和差错控制。

  • TCP协议(传输层:第一个点到点)

    • 面向连接的、可靠的、基于字节流的传输层通信协议
    • 将应用层的数据流分割成报文段,并发送给目标节点的TCP层
    • 数据包都有序号,对方收到则发送ACK确认,未收到则重传
    • 使用(奇偶)校验和来检验数据在传输中是否有误

    TCP报文:

    img

    TCP报文是TCP层传输的数据单元,也叫报文段。

    • TCP Flags: URG 紧急指针标志、ACK确认序号标号、PSH push标志、RST 重置连接标志、SYN 同步序号,用于连接过程、FIN finish标志,用于释放连接。

    全双工通信 A到B亦可B到A

  • TCP & UDP

    TCP面向连接;可靠性高;有序;速度慢;量级重(数据报报头20字节)
    UDP面向非连接;可靠性低;无序;速度快;量级轻(数据报报头8字节)

    可靠的,不可靠的:面向连接(拥塞控制,序号机制,校验等)

三. 网络协议

image-20200429000459191 image-20200429000602625

(七层/五层网络模型)

网络模型数据传输格式作用相关设备网络协议
应用层消息(message)//HTTP、FTP、DNS
传输层报文段(segment,TCP)/
用户数据报(datagram,UDP)
添加端口TCP、UDP
网络层数据包(package)/
数据报(datagram)
添加IP地址路由器IP、ARP
链路层帧(fram)添加mac地址网桥、网卡、交换机Ethernet
物理层比特(b)/集线器IEEE 802.2

详见链接

四. Socket

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。TCP/IP协议族包括运输层、网络层、链路层。

img

先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。

img

应用层和传输层之间

客户端:connector,write,

服务端:bind,listen,accept

网络中唯一的进程:IP+TCP+端口号。(IP唯一标识一个主机,TCP协议和端口号唯一标识主机的一个进程)

详见链接

Http请求get和post的区别

从三个层面来解答:

  • Http请求报文层面:

    get将请求信息放在URL中,长度有限(URL有限);post放在报文体(body)中,长度无限。
    get将请求信息放在URL中,请求信息和URL用?隔开,请求信息的格式为键值对;post将请求信息放在报文体中,想获得请求信息必须解析报文,因此安全性比get要高些,事实上要获取报文体中信息也容易(解决方案https),故安全性差不多。

  • 数据库层面:

    get符合幂等性和安全性;post不符合。

    get是一种查询操作;post需要提交数据,获取结果不同、作用于上一结果。

    幂等性:对数据库的一次操作和多次操作获取的结果是一致的,则认为符合幂等性

    安全性:对数据库的操作没有改变数据库。

  • 其他层面:

    get可以被缓存,被存储;而post不行。

    CDN处理,减轻服务器负担。

Http响应状态码

五种可能取值:

  • 1xx: 指示信息,表示请求已被接收,继续处理
  • 2xx: 成功,表示请求已被成功接收、理解、接受
  • 3xx: 重定向,要完成请求必须进行更进一步的操作
  • 4xx: 客户端错误,请求有语法错误或者请求无法实现(404)
  • 5xx: 服务器端错误,服务器未能实现合法的请求

常见的状态码:

  • 200:OK,正常返回信息
  • 400:Bad Request,客户端请求有语法错误,不能被服务器所理解
  • 401:Unauthorized,请求未经授权,这个状态码必须和www-Authenticate 报头域一起使用
  • 403:Forbidden,服务器收到请求,但是拒绝提供服务
  • 404:Not Found,请求资源不存在,eg,输入了错误的URL
  • 500: Internal Server Error,服务器发生不可预期的错误
  • 503:Server Unavailable,服务器当前不能处理客户端的请求,一段时间后可能恢复正常

Http & Https

端口号

一个主机可以提供多种服务,但是这个主机只有一个IP地址,区分不同的服务就需要端口来区分. 例如,web服务器提供80端口来建立HTTP连接(443HTTPS连接).

五.HTTP发展历史-http0.9/http1.0/http1.1/http2.0

掘金来源

1.简介

HTTP(hyper text transfer protocol,超文本传输协议),从万维网(WWW)服务器传输超文本到本地浏览器的传送协议.

属于应用层的协议,基于TCP/IP通信协议传递数据(HTML文件,图片等)

2.发展

HTTP版本:http0.9,http1.0,http1.1,http2.0

  • http0.9

    GET/index.html
    
    • 只有一个GET命令,表示建立TCP连接后,请求获取服务器html资源.
  • http1.0

    • 改进
      发送内容:任何格式的内容都可以发送,不仅可传输文字,亦可传输图像,视频,二进制文件
      请求命令:除了GET命令,引入POST,HEAD命令
      请求响应格式:加入头信息(header)
      其它:新增状态码,权限,缓存等

    • 问题
      短连接,每个TCP连接只能发送一个请求.发送数据完毕,连接就关闭,如果还要请求其它资源,就必须再新建一个连接

  • http1.1

    • 改进

      • 长连接: HTTP 1.1 支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个 TCP 连接上可以传送多个 HTTP 请求和响应,减少了建立和关闭连接的消耗和延迟,在 HTTP1.1 中默认开启 Connection: keep-alive,一定程度上弥补了 HTTP1.0 每次请求都要创建连接的缺点。
      • **缓存处理:**在 HTTP1.0 中主要使用 header 里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1 则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
      • 带宽优化及网络连接的使用,HTTP1.0 中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1 则在请求头引入了range 头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
      • 错误通知的管理,在 HTTP1.1 中新增了24 个错误状态响应码,如 409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
      • Host 头处理,在 HTTP1.0 中认为每台服务器都绑定一个唯一的 IP 地址,因此,请求消息中的 URL 并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个 IP 地址。HTTP1.1 的请求消息和响应消息都应支持 Host 头域,且请求消息中如果没有 Host 头域会报告一个错误(400 Bad Request)。
    • 问题

      • 队头阻塞:虽然 1.1 版允许复用 TCP 连接,但是同一个 TCP 连接里面,所有的数据通信是按次序进行的。服务器只有处理完一个回应,才会进行下一个回应。要是前面的回应特别慢,后面就会有许多请求排队等着。这称为"队头堵塞"(Head-of-line blocking)
  • 明文传输不安全:HTTP1.x 在传输数据时,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份,这在一定程度上无法保证数据的安全性。

    • **无状态特性–带来巨大HTTP头部:**HTTP1.x 在使用时,header 里携带的内容过大,在一定程度上增加了传输的成本,并且每次请求 header 基本不怎么变化,尤其在移动端增加用户流量。
  • 不支持服务器推送消息

  • 虽然 HTTP1.x 支持了 keep-alive,来弥补多次创建连接产生的延迟,但是 keep-alive 使用多了同样会给服务端带来大量的性能压力,并且对于单个文件被不断请求的服务(例如图片存放网站),keep-alive 可能会极大的影响性能,因为它在文件被请求之后还保持了不必要的连接很长时间。

  • SPDY协议

    谷歌研发SPDY协议,降低延迟、压缩header等HTTP-SPDY-SSL-TCP

  • Http2.0

    • 改进
      • 二进制分帧
      • 多路复用
      • 请求优先级
      • header压缩
      • 服务端推送
    • 问题
      • 延迟问题,两个握手TCP三次握手和TLS安全层握手
      • 并未真正解决队头阻塞问题,如果丢包,需要重传
  • HTTP3

    基于UDP协议的“QUIC”协议,真正完美解决了“队头阻塞”问题。

    • 基于UDP,实现快速握手功能
    • 实现了类似TCP的流量控制,可靠传输
    • 继承TLS加密功能
    • 多路复用,彻底解决TCP中队头阻塞问题(同一个物理连接上可以有多个独立的逻辑数据流)
  • 总结:

    • HTTP/1.1有两个主要的缺点:安全不足和性能不高。
    • HTTP/2完全兼容HTTP/1,是“更安全的HTTP、更快的HTTPS",头部压缩、多路复用等技术可以充分利用带宽,降低延迟,从而大幅度提高上网体验;
    • QUIC 基于 UDP 实现,是 HTTP/3 中的底层支撑协议,该协议基于 UDP,又取了 TCP 中的精华,实现了即快又可靠的协议.

    HTTP/2与HTTP/3

六.IT楠老师-知识点补充

DNS域名解析:在浏览器输入域名,先从本地缓存(host文件)查找域名,若没有通过DNS域名解析,将域名解析为IP地址,这样就可以找到服务器.

计算机有65536个端口,网络端口默认80

码出高效(孤尽)

第一章 计算机基础

  • 32位计算机,CPU能处理32位电路信号

  • 正数补码反码原码一样;负数补码是符号位不变,其余位取反加一

  • 规定数字类型?类型是有范围的(电路条数),防止溢出

  • 8位(b)=1字节(B),1024B= 1KB; 1024 = 2^11

  • 科学计数法:符号,有效数字,指数
    单精度浮点数格式:符号位,阶码位(存指数),尾数位(有效数字)
    禁止通过判断两个浮点数是否相等来控制某些业务流程,可使用decimal类型,float和double存在精度损失问题.

  • CPU:控制器,运算器,内部寄存器组成

  • 数据的丰装及发送:端口--IP地址–MAC地址

  • UDP仅是在IP数据包上增加端口等部分信息,是面向无连接的,不可靠的传输,多用于视频通信,电话会议等(即少一帧数据也无妨);TCP是面向连接的,是一种端到端间通过失败重传机制建立的可靠数据传输方式,有拥塞控制,序号机制,校验等.

  • IP是面向无连接,无状态的,没有额外机制保证发送的包是否有序的到达.
    IP地址属于网络层,主要功能在WLAN内进行路由寻址,选择最佳路由

  • 数据包存活时间,TTL(time to live)
    ICMP(internet control message protocol),检测网络是否通畅,主机是否可达,路由是否可用等网络运行状态的协议.

  • 为什么需要三次握手?
    信息对等和防止超时.信息对等:客户端和服务端都需要确定:自己和对方有收发信息的能力;防止超时,如果两次就可以建立连接,之前超时的请求到达服务端,会导致脏连接

  • 2MSL

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值