对象面试官系列之计算机网络--面试官看了都说好

1.结构


物理层:为通信的两端建立、管理和释放物理链接,实现比特流的传输。这层的数据叫比特。

数据链路层:主要将从物理层接受的数据用mac地址(网卡硬件地址)封装成帧。在这一层工作的设备为交换机。

网络层:主要将从数据链路层接受的数据用IP地址的封装成数据报文段。这一层工作的设备为路由器,这层的数据叫数据报。

扩展:

arp协议:实现从IP地址到MAC地址的映射(由上到下封装)请求包回应包形式

传输层:定义了一些传输数据的协议和端口号,如TCP,UDP。主要将从网络层接受的数据进行分段传输,到达目的地后进行重组,也即负责向两台主机进程之间的通信提供通用的数据传输服务。这一层的数据叫段。

会话层:通过传输层(端口号:传输端口和接收端口)建立数据传输的通路。主要在系统间发起会话或接受会话的请求。

表示层:主要是进行对接收的数据进行解释、加密与解密、压缩与解压缩等操作,也就是把计算机能识别的东西转换成人类能识别的东西。

应用层:主要是一些终端应用,例如FTP、Web、DNS应用,HTTP协议。

2.三次握手


过程:

第一次握手:客户端发送一个报文段,SYN连接标志位为1和一个初始序列号seq给服务端;

第二次握手:服务端发送一个SYN为1,ACK为1,确认编号=seq+1,并随机产生一个自己的初始序列号的报文段,发送给客户端;

第三次握手:客户端检查确认编号是否为序列号+1,ACK是否为1,检查正确之后将自己的ACK置为1,产生一个ack=服务器发的序列号+1,发送给服务器,可以携带数据;服务器检查ACK为1和ack为序列号+1之后,完成三次握手,连接建立

扩展:

一、可以两次吗:
服务端收到失效的连接报文段就会建立连接,浪费链接资源
服务端无法确认第二次握手时客户端有没有正确接收到报文

二、第三次握手时的客户端ACK未送达服务器:

1.由于服务端没有收到ACK确认,因此会重发之前的SYN+ACK(默认重发五次,之后自动关闭连接进入CLOSED状态),客户端收到后会重新传ACK给Server

2.如果服务端处于超时重发状态,收到客户端ACK会进入连接状态;如果处于关闭状态,以RST包应答

三、攻击:

SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,由于源地址是不存在的,因此,Server需要不断重发直至超时,这些伪造的SYN包将占用链连接资源,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪

3.四次挥手

第一次挥手:Client将关闭连接标志FIN置为1发送给Server;

第二次挥手:Server收到FIN之后,发送一个ACK=1,进入CLOSE_WAIT状态。此时客户端已经没有要发送的数据了,但仍可以接受服务器发来的数据。

第三次挥手:Server将FIN置1进入LAST_ACK状态;

第四次挥手:Client收到服务器的FIN后,将ACK置1,进入TIME_WAIT状态;客户端等待2*MSL(报文段最长寿命)时间后,也进入CLOSED状态。服务器收到后,确认ack后,变为CLOSED状态,不再向客户端发送数据。完成四次挥手。

扩展:

一、第二次挥手时服务器的ACK没有送达客户端:

二、客户端TIME_WAIT状态的意义:

1.防止接收过期的数据,a和b断开连接后,如果c又和a建立连接,b的过期报文段同样会被a接收

2.第四次挥手时,客户端发送给服务器的ACK有可能丢失,TIME_WAIT状态就是用来重发可能丢失的ACK报文。如果Server没有收到ACK,就会重发FIN,如果Client在2*MSL的时间内收到了FIN,就会重新发送ACK并再次等待2MSL,防止Server没有收到ACK而不断重发FIN。2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。

三、大量Time_wait状态:

但是某些服务如pop/smtp、ftp却是服务端收到客户端的QUIT命令后主动关闭连接,这就造成这类服务器上容易出现大量的TIME_WAIT状态的连接,而且并发量越大处于此种状态的连接越多

解决:通过配置文件打开系统的TIMEWAIT重用和快速回收

4.TCP流量控制

TCP利用滑动窗口实现流量控制。接收方会维护一个接收窗口,表示缓存区的剩余大小;在返回ACK对发送方进行确认的时候将接受窗口大小放在TCP报文中的窗口字段告知发送方。发送窗口的大小不能超过接受窗口的大小,只有当发送方发送并收到确认之后,才能将发送窗口右移。

接收窗口为0时会怎样

这时发送方必须暂停发送数据,但是会启动一个持续计时器,到期后发送一个大小为1字节的探测数据包,以查看接收窗口状态。如果接收方能够接收数据,就会在返回的报文中更新接收窗口大小,恢复数据传送。

5.拥塞控制

1.慢启动:刚开始发送数据时,先把拥塞窗口设置为一个最大报文段MSS的数值,每经过一个传输轮次,拥塞窗口的大小就会加倍

2.拥塞避免:当拥塞窗口的大小达到慢开始门限时,开始执行拥塞避免算法,拥塞窗口大小不再指数增加,而是线性增加,即每经过一个传输轮次只增加1MSS.

无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认),就要把慢开始门限设置为出现拥塞时的发送方窗口值的一半(但不能小于2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。(这是不使用快重传的情况)

3.快重传:快重传要求接收方在收到一个失序的报文段后就立即发出重复确认。发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。

4.快恢复:当发送方连续收到三个重复确认时,就把慢开始门限减半,然后执行拥塞避免算法。不执行慢开始算法的原因:因为如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方认为现在网络可能没有出现拥塞。

6.TCP/UDP

区别:

1.连接
TCP是面向连接的传输层协议,传输数据前先要建立连接;UDP是不需要连接,即刻传输数据。
2.服务对象

TCP是一对一的两点服务,即一条连接只有两个端点;UDP支持一对一、一对多、多对多的交互通信

3.可靠性

TCP是可靠交付数据的,数据可以无差错、不丢失、不重复、按需到达;UDP是尽最大努力交付,不保证可靠交付数据。

4.拥塞控制、流量控制

TCP有拥塞控制和流量控制机制,保证数据传输的安全性;UDP则没有,即使网络非常拥堵了,也不会影响UDP的发送速率。

5.首部开销

TCP首部长度较长,会有一定的开销,首部在没有使用「选项」字段时是20个字节,如果使用了「选项」字段则会变长的;UDP首部只有8个字节,并且是固定不变的,开销较小。

TCP为什么可靠:

1.校验和:传输时将伪首部,tcp首部,tcp报文段分成16位的整数,将这些整数反码求和得到校验和

2.序列号和确认标志位

3.三次握手四次挥手:

4.流量控制、拥塞控制

5.超时重传:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。

7.TCP报文格式

序号:用于对字节流进行编号,例如序号为301,表示第一个字节的编号为301,如果携带的数据长度为100字节,那么下一个报文段的序号应为401。

确认号:期望收到的下一个报文段的序号。例如B正确收到A发送来的一个报文段,序号为501,携带的数据长度为200字节,因此B期望下一个报文段的序号为701,B发送给A的确认报文段中确认号就为701。

数据偏移:指的是数据部分距离报文段起始处的偏移量,实际上指的是首部的长度。

确认ACK:当ACK=1时确认号字段有效,否则无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置1。

同步SYN:在连接建立时用来同步序号。当SYN=1,ACK=0时表示这是一个连接请求报文段。若对方同意建立连接,则响应报文中SYN=1,ACK=1。

终止FIN:用来释放一个连接,当FIN=1时,表示此报文段的发送方的数据已发送完毕,并要求释放连接。

窗口:窗口值作为接收方让发送方设置其发送窗口的依据。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。

8.输入网址到页面

1.DNS解析:浏览器查询DNS,获取域名对应的IP地址。

浏览器搜索自身的DNS缓存

搜索操作系统的DNS缓存,也就是host文件

向本地DNS服务器进行查询

向根域名服务器进行查询获取com服务器的ip地址进行查询,baidu.com服务器查询,www.baidu.com服务器查询

2.TCP连接:浏览器获得域名对应的IP地址以后,浏览器向服务器请求建立链接,发起三次握手;

3.TCP/IP链接建立起来后,浏览器向服务器发送HTTP请求;

4.服务器接收到这个请求,返回HTTP报文;

5.浏览器解析渲染页面:浏览器解析并渲染视图,若遇到对js文件、css文件及图片等静态资源的引用,则重复上述步骤并向服务器请求这些资源;

6.关闭连接

9.HTTP常见状态码

1xx状态码:中途响应。100继续发送请求

2xx状态码:操作成功。200 OK

3xx状态码:重定向。301永久重定向;302暂时重定向(301对搜索引擎优化(SEO)更加有利;302有被提示为网络拦截的风险)

4xx状态码:客户端错误。400请求报文存在语法错误;401 请求没有通过身份认证;403 请求被服务器拒绝;404服务器没有找到请求资源;

5xx状态码:服务端错误。500通用服务器错误;501无法识别HTTP方法

10.HTTP报文结构

1.HTTP请求报文由请求行、请求头、空行、请求体4个部分构成;

请求行:请求方法、URI、HTTP协议版本

请求头:connection:是否开启长连接;host:端口号

accept:接收的响应类型;Cookie;Referer:从哪个url地址过来

空行:表示请求头已结束

请求体:

2.HTTP响应报文由响应行、响应头、响应体3个部分构成

响应行:HTTP协议版本、状态码、描述

响应头:Allow:支持请求方式;Date:当前时间

Content-Encoding:编码方式;Content-Length:内容长度 Content-Type:文档类型

11.HTTP和HTTPS的区别

1.http信息是明文传输,https则是具有安全性的ssl加密传输协议

2.HTTPS协议需要到ca申请证书需要一定费用

3.HTTP使用的是80端口,HTTPS使用443端口

ssl连接过程

1.客户端发送请求到服务器端

2.服务器端返回证书和公钥,公钥作为证书的一部分而存在

3.客户端验证证书和公钥的有效性,如果有效,则生成共享密钥并使用公钥加密发送到服务器端

4.服务器端使用私钥解密数据,并使用收到的共享密钥加密数据,发送到客户端

5.客户端使用共享密钥解密数据

6.SSL加密建立

12.粘包拆包

1.要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包

2.待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包

3.要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包

4.接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包

解决方法:设置报文段长度;设置终止标志位;固定长度;

13.长连接短连接

1.长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket创建也是对资源的浪费。

2.而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。

14.HTTP1.0 1.1 2.0区别

1.新的二进制格式,HTTP1.x的解析是基于文本。

2.http2.0采用连接多路复用机制;同一个连接并发处理多个请求

3.http2.0对请求头也进行了压缩;

15.keep-alive

http的keep-alive的作用是开启http的长连接,减少tcp连接建立的次数,以提高性能和服务器的吞吐量。但是keep-alive也存在一些问题,长时间的tcp连接会导致系统资源的无效占用,故要正确设置keep-alive timeout时间(即服务器连接建立后如果keep-alive timeout的时间内客户端与服务端无请求那么就会断开连接)

Tcp的Keep-alive:连接后超过一段时间没有数据传输,TCP自动发送一个数据为空的报文(侦测包)给对方,如果对方回应了这个报文,说明对方还在线,连接可以继续保持,如果对方没有报文返回,并且重试了多次之后则认为链接丢失,没有必要保持连接。


对象面试官系列:

#高频知识点汇总##春招##实习##面经##秋招##Java#
全部评论
对象面试官系列持续更新中
点赞 回复
分享
发布于 2021-12-20 10:13
🎉恭喜牛友成功参与 【创作激励计划】高频知识点汇总专场! ------------------- 创作激励计划5大主题专场等你来写,最高可领取500元京东卡和500元实物奖品! 👉快来参加吧:https://www.nowcoder.com/discuss/804743
点赞 回复
分享
发布于 2021-12-20 11:57
滴滴
校招火热招聘中
官网直投
牛逼
点赞 回复
分享
发布于 2021-12-20 20:39

相关推荐

点赞 评论 收藏
转发
29 97 评论
分享
牛客网
牛客企业服务