计算机网络面试高频知识点总结(七层模型、三次握手、四次挥手、可靠传输、socket、http)

一、OSI(开放互联基本参考模型)七层协议:

七层划分为应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。
五层划分为应用层、传输层、网络层、数据链路层、物理层。
四层划分为应用层、传输层、网络层、网络接口层。
​​​​​​分层图
1.物理层:(比特bit)
作用:通过媒介传输比特——利用传输介质为数据链路层提供物理连接。

协议:以太网协议(IEE802.3)、时钟协议(CLOCK)。

设备:中继器、集线器

2.数据链路层:(帧)

作用:将网络层数据封装成帧,用MAC地址访问媒介——将有差错的物理线路变为无差错的数据链路。

协议:MAC地址协议(MAC)、点对点协议(PPP)、虚拟局域网协议(VLAN)

设备:网桥、交换机

3.网络层:(包)

作用:提供逻辑地址(IP),数据从源端到目的端传输。

协议:IP协议、地址解析协议(ARP)、互联信息控制协议(ICMP:追踪IP是否成功到达及丢包原因)

设备:网络层中继系统:路由器,网络层以上的中继系统:网关

4.传输层:(报文)

作用:不同主机上进程间通信,提供可靠的端到端差错和流量控制。

协议

TCP——传输控制协议:面向连接的,数据传输单位是报文段,提供可靠的交付),

UDP——用户控制协议:无连接的,数据传输单位是用户数据报,不保证可靠交付,

SCTP——流控制传输协议。

5.会话层:(会话层协议数据单元SPDU)

作用:三大功能——建立、管理和终止会话。

协议:远程过程调用协议(RPC)、网络文件系统(NFS)

6.表示层:(表示层协议数据单元PPDU)

作用:数据加密、解密和压缩。

协议:图像数据压缩协议(JPEG)、音频/视频压缩协议(MPEG)、ASCII

7.应用层:(应用层协议数据单元APDU)

作用:提供各种各样的应用层协议,提供应用程序和网络的接口。

协议:超文本传输协议(HTTP)、文件传输协议(FTP)、域名解析协议(DNS)、电子邮件协议(SMTP)、虚拟终端协议(Telnet)

二、TCP三次握手

1.连接过程:
SYN:同步序列号,用来发起一个连接。

ACK:确认标识,当ACK=1时确认字段才有效。

seq:序列号,即数据包本身的序列号,为连接以后传输数据使用;

ack:对收到数据包的确认,告诉对方期望下一个收到的序号。

在这里插入图片描述
客户端——A,服务器——B

A处于关闭状态(CLOSED),建立连接时主动打开,向B发送连接请求报文段(同部位SYN=1,随机序号seq=x),此时A状态变为同步发送(SYN-SEND)。

B初始状态为关闭状态(CLOSED),被动打开,收到A请求后,会返回确认报文段(同部位SYN=1,确认号ACK=1,随机序号seq=y,确认号ack=x+1),此时B状态为同步收到(SYN-RCVD)。

A收到返回报文,向B最后发送确认报文(确认号ACK=1,序号seq=x+1,确认号ack=y+1),此时以建立连接,二者状态为已建立连接(ESTABLISHED)
2.确认号ack
确认号ack是告诉A期望下一个报文收到的序号。

确认号ack=N,则表明:序号N-1前的数据已全部正确收到。

SYN在建立连接时,用来同步序号。当SYN=1,ACK=0时,表明是一个连接请求的报文

3.为什么要三次确认而不是两次?

为了防止已失效的连接请求报文突然又传送到服务端。
A发出连接请求报文后,由于长时间滞留没有及时到达服务器,于是会在此发送请求建立连接报文。对于B,后来收到了A第一次的连接报文,误认为要建立连接,B端就创建了套接字,一直等待接收数据,但A并不会发送数据,造成资源浪费。

4.为什么不是四次握手?

在上述第二次握手中,可以拆为两个步骤。

(1)先发送确认报文段(确认号ACK=1,确认号ack=x+1);
(2)再发送同步报文段(同部位SYN=1,序号seq=y)。

这样就变成了四次握手,TCP是全双工的(通信双方都可以互发),效果是一样的,将其合并提高效率。

5.初始序号seq为什么是随机的?

出于网络安全的因素着想,如果不是随机产生初始序列号,黑客将会以很容易的方式获取到你与其他主机之间通信的初始化序列号,并且伪造序列号进行攻击,这已经成为一种很常见的网络攻击手段。

6.如果已经建立了连接,客户端突然出现故障了怎么办?

TCP设有保活计时器,A如果出现故障,B不会一直等下去浪费资源。

B若2小时还没有收到A任何数据,就发送一个探测报文段,并且每隔75秒发送一次。连发10个探测报文仍没反应,B就认为A出了故障,关闭连接。

三、四次挥手

客户端——A,服务器——B。
在这里插入图片描述
(1)连接释放前A 和 B正常数据传输,二者状态为建立连接(ESTABLISHED),

A先发出主动释放的报文段(终止位FIN=1,序号seq=u,u等于A上一次发送给B的序号加1),此时A状态为终止等待1(FIN-WAIT1)。

(2)B收到A发出的释放请求,返回确认报文段(确认号ACK=1,序号seq=v,确认号ack=u+1)。A收到B的确认报文段,状态变为终止等待2(FIN-WAIT2),等待B的释放信号。

此时B状态为关闭等待(CLOSE-WAIT)。此时从A到B方向的连接释放,TCP连接处于半关闭状态(A不给B发送了,但B会给A发送),在半关闭状态B可能会给A发一些数据(未必之前全部数据都发送给A)。

(3)B不需要发送数据时,会向A发出连接释放报文段(终止为FIN=1,确认号ACK=1,序号seq=w,确认号ack=u+1),此时B状态为最后确认(LAST-ACK)。

(4)A收到B的连接释放报文段,发出确认报文段(确认位ACK=1,序号seq=u+1,确认号ack=w+1),A进入时间等待(TIME-WAIT)状态,B收到确认后就成为了关闭状态(CLOSED)。经过2MSL(MSL最长报文段寿命),A进入关闭状态(CLOSED),连接释放成功。

2.为什么A在时间等待状态为 2MSL 时间?
MSL:报文在网络上存在的最长时间,超过这个时间报文将被丢弃。
原因有两个:
(1)保证A最后一次发出的确认报文能被B收到。

客户端A发出的确认可能丢失,B未收到会超时重传连接释放的报文(FIN+ACK),而A就可以在2MSL时间内收到重传的报文,给出回复(A发出到B一个MSL,B未收到重传又是一个MSL),此时A重启2MSL计时。

(2)防止已失效的连接请求报文又传送到服务端B。

连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃(全部消失),不影响下一个连接(请求)。

3.如果已经建立了连接,客户端突然出现故障了怎么办?

TCP设有保活计时器,A如果出现故障,B不会一直等下去浪费资源。

B若2小时还没有收到A任何数据,就发送一个探测报文段,并且每隔75秒发送一次。连发10个探测报文仍没反应,B就认为A出了故障,关闭连接。

4.为什么服务器B收到释放请求后不是立即关闭?为什么需要四次挥手?

服务器B收到释放请求报文时,需要等待把之前的所有报文数据发完,才能关闭。

a.只能先回复一个确认报文ACK,告诉A,“你发的FIN报文我收到了”。

b.等到B所有的报文发送完,才能发送释放报文。

因此不能立即关闭,需要四次挥手。

5.SYN泛洪攻击:

攻击者向服务器发出大量的第一次握手连接SYN,却不进行确认,导致服务器死机。

A(攻击者)发送TCP SYN,SYN是TCP三次握手中的第一个数据包,而当服务器返回ACK后,A不再进行确认,那这个连接就处在了一个挂起状态,也就是半连接的意思。

服务器收不到确认的消息,会重复发送ACK给A。这样就会浪费服务器资源。A对服务器发送大量非法的这种TCP连接,由于每一个都没法完成握手的机制,所以它会消耗服务器内存最后导致服务器死机,就无法正常工作了。

更进一步说,如果这些半连接的握手请求是恶意程序发出,并且持续不断,那么就会导致服务端较长时间内丧失服务功能——这样就形成了DoS攻击。这种攻击方式就称为SYN泛洪攻击。

四、TCP可靠传输

1.确认应答

接收方收到数据后,会给出一个确认应答,表示已收到数据,并且会发送确认号ack说明下一个需要接收的序号。

2.超时重传

发出一个数据后开启定时器,在预定的时间内未收到应答回复的ACK确认报文,就重新发送。

RTO(重传超时时间)=2*RTT(报文段往返时间)+偏差值

(1)重传超时时间(RTO)设过长,重发就慢,效率低。

(2)重传超时时间(RTO)设过短,重发就快,会增加网络拥塞。

3.滑动窗口(以字节为单位)

3.1窗口机制

在TCP协议当中窗口机制分为固定窗口和滑动窗口两种:

如果窗口过小,当传输较大的数据时要不停的进行确认,会造成很大延迟。
如果窗口过大,一次发送太多的数据,造成网络拥塞。

因此,我们引入了滑动窗口。

3.1滑动窗口
以字节为单位的TCP滑动窗口实现了网络传输的流量控制。目的是解决接收端和发送端对数据的处理速度不同的问题。

滑动窗口内的数据不需要确认应答就可以发送,窗口大小就是无需确认可连续发送数据的最大值。tcp是全双工,所以两边都有滑动窗口。

滑动机制:

(1)发送窗口只有收到发送窗口内字节的ACK确认,才会移动左边界。
(2)接收窗口只有在前面所有报文段都确认收到的情况下才会移动左边界。
真实的数据传输过程是由两个缓存来实现,如访问网页数据时先把数据放入缓存。

4.拥塞控制
网络资源需求超过所提供的可用部分,就产生了拥塞。

∑ 对资源需求 > 可用资源

只要发送发没有按时收到确认应答(超时),就判定为网络拥塞。基于窗口的四种拥塞控制算法:慢开始、拥塞避免、快重传、快恢复。

4.1慢开始

慢开始算法由小到大逐渐增大拥塞窗口,开始时先拥塞窗口大小(cwnd)的初始值设为1,发送方每收到一个ACK(一个往返时间RTT)确认就将拥塞窗口cwnd*2,增长规律为2为底的指数型。

4.2拥塞避免

拥塞避免算法目的是让拥塞窗口缓慢增大,设置一个慢开始门限(ssthresh),当拥塞窗口cwnd>ssthresh时,发送方经过RTT把拥塞窗口cwnd加1,线性规律增长。增长到一定数值还是会出现超时导致拥塞。此调整门限值:ssthresh=cwnd/2,设置cwnd=1,再次进入慢开始阶段。

4.3快重传

快速重传和快速恢复算法一般同时使用。

快重传要求接收方收到数据后立即确认,以便于尽早知道报文丢失。发送方若连续收到3个重复确认后就认定数据丢失,立即进行重传(传的是丢失的那个即下一个)。

4.4快恢复

发送方知道只是丢失个别报文段,不去执行慢开始算法,而是执行快恢复算法。

当发送方连续收到三个重复确认时,执行快恢复算法:“乘法减小”,慢启动门限ssthresh=cwnd/2,调整拥塞窗口cwnd=ssthresh。开始执行拥塞避免算法,拥塞窗口cwnd值线性增大。

五、Socket通信

TCP协议是面向对象连接、可靠的、有序的,以字节流的方式发送数据。

socket需要指定协议是IPv4还是IPv6,分别设置AF_INET和AF_INET6。指定TCP协议参数设置SOCK_STREAM,指定UDP协议设置SOCK_DGRAM。

1.基于TCP的socket网络编程——SOCK_STREAM
(1)客户端程序步骤
【创建socket】——【设置IP地址、端口连接服务器】——【write()/send() 向服务器发送数据】——【read()/recv() 从服务器接收数据】——【close() 关闭连接】
(2)服务器端程序步骤
【创建socket】——【bind()绑定IP地址、端口到socket】——【listen() 监听端口,设置最大连接数】——【accept() 接收来自客户端连接】——【read()/recv() 接收客户端数据】——【write()/send() 向客户端发送数据】——【close() 关闭连接】

2.基于UDP的socket网络编程:——SOCK_DGRAM。
(1)客户端程序步骤
【创建socket】——【bind() 绑定IP地址、端口】——【sendto() 向服务器发送数据】——【recvfrom() 从服务器接收数据】——【close() 关闭连接】
(2)服务器端程序步骤
【创建socket】——【bind() 绑定IP地址、端口】——【recvfrom() 从客户端接收数据】——【sendto() 向客户端发送数据】——【close() 关闭连接】

六、http相关

HTTP协议:

http超文本传输协议属于面向事务、无连接、无状态的应用层协议,http报文使用面向连接的TCP协议传送数据,http交互可完传送信息和获取信息。

1.Http报文结构
HTTP客户端和服务器端的通信过程包括了发送请求和返回响应两个过程。对应的,http报文包括请求报文和响应报文两部分,HTTP报文是多行数据构成的字符串文本,每一个字段都是ASCII码串。

请求报文

请求行:方法字段、URL、HTTP版本号三部分。
GET www.baidu.com HTTP/1.1 //请求行

请求方法包括GET、HEAD、PUT、POST、TRACE、OPTIONS、DELETE 以及扩展方法。常用的有HTTP/1.0和HTTP/1.1。

首部行:字段名、值两部分
Host: www.baidu.com //主机域名 Connection: close //告诉服务器发送完请求的信息后就释放连接 Accept-Language: cn //表示希望优先得到中文版本文档

实体主体:一般不用这个字段。

响应报文

状态行:包括版本、状态码、短语三部分
HTTP/1.1 202 Accepted //接受 HTTP/1.1 400 Bad Request //错误的请求

状态码告知由服务器端返回的请求的状态,一般由一个三位数组成,分别以整数1~5开头组成。短语说明状态码含义,常见状态码:

1xx:表示请求正在处理。
2xx:表示成功接收请求,并已完处理过程。
3xx:重定向,如要完成请求还需进一步操作。
4xx:客户端类请求错误,404(在web服务器中没有)、403(服务器拒绝访问,权限不够)。
5xx:服务器端的错误。

首部行和状态行同请求报文。

2.http1.0和http1.1区别

(1)http1.1默认长连接

http1.0默认采用非持续连接(短连接),可使用keep-alive参数建立长连接,而http1.1默认采用持续连接(长连接)。

(2)http1.1支持Host字段

http1.0没有host域,http1.1支持Host域,请求消息没有Host域会报告错误(400)

一台物理服务器上存在多个虚拟主机共享一个IP地址,不再是每台服务器绑定一个唯一的IP地址。
(3)http1.1节约带宽(range头域)

http1.0必须请求整个对象,存在带宽的浪费,而http1.1在请求头引入了range头域,支持只传送资源需要的部分,节约带宽。

(4)http1.1节约带宽(新状态码:100)

http1.1支持只发送头域(header)信息,不带任何body信息,如果服务器认为客户端有权限请求服务器,则返回100,否则返回401。客户端如果接收到100,才开始把请求body发送到服务器。

(5)http1.1的缓存(Cache)

缓存: 当客户端向服务器请求资源时,会先抵达浏览器缓存,如果浏览器有“要请求资源”的副本,就可以直接从浏览器缓存中提取而不是从原始服务器中提取这个资源。

http1.1在1.0的基础上加入了一些cache的新特性,cache-control字段

3.http1.1和http2.0区别

(1)多路复用

http1.1协议在同一时间针对同一域名下的请求有一定数量限制,超过限制数目请求会被阻塞。所有的http2.0允许同时通过单一连接发起多重的请求-响应消息。

(2)二进制分帧

http2.0在应用层(http)和传输层(TCP/UDP)之间增加一个二进制分帧层。http2.0将所有传输的信息分割为更小的消息和帧,并对它们采用二进制编码,传输效率更高。

(3)首部压缩

http1.1中头部元数据以纯文本的形式发送,不支持压缩。http2.0使用HPACK 算法首部压缩,减少占用流量降低延迟。

(4)服务端推送

http2.0可提前将资源推送给客户端,这样客户端要用到的时候直接调用即可,不用再发送请求。

1.HTTP/2采用二进制格式而非文本格式; 2.HTTP/2是完全多路复用的,而非有序并阻塞的——只需一个连接即可实现并行; 3.使用报头压缩,HTTP/2降低了开销; 4.HTTP/2让服务器可以将响应主动“推送”到客户端缓存中;

4.GET和POST区别

(1)get请求通过URL传递数据,post把数据放在http包体中(requrest body);
(2)get请求把http消息头(header)和数据一并发送,服务器响应200(返回数据);post先发http消息头(header),http响应100continue,再发送数据,服务器响应200(返回数据);
(3)get产生一个TCP数据包,post产生两个TCP数据包(基于2);
(4)get请求有数据长度限制,post理论上没有限制;
(5)get只能进行ASCII编码,post没有限制;
(6)get数据会被浏览器缓存或保留历史记录中,而post不会(除非手动设置);
(7)post比get更安全;(get数据直接暴露在URL中)

5.Http与Https区别

Http:

超文本传输协议。Http协议是以明文方式发送信息的,如果黑客截取了传输报文,就可以直接获得其中的信息。

Https:

是Http的安全版。Https的安全基础是SSL。SSL协议位于TCP/IP协议与各种应用层协议之间,提供安全支持。

SSL协议可分为两层:SSL记录协议(SSL Record Protocol),它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。SSL握手协议(SSL Handshake Protocol),它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。

1、https协议需要到CA申请证书,一般免费证书较少,因而需要一定费用。(原来网易官网是http,而网易邮箱是https。)

2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。

3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

4、http的连接很简单,是无状态的。Https协议是由SSL+Http协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。(无状态的意思是其数据包的发送、传输和接收都是相互独立的。无连接的意思是指通信双方都不长久的维持对方的任何信息。)

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值