学习计算机网络准备面试的同时做了一些笔记,分享出来希望能够帮助大家快速掌握计算机网络常遇到的问题。
笔记主要选自《图解HTTP》与《图解TCP/IP》以及网络面经,由于本人也是处于学习阶段,同时笔记是Word转MD上传,格式与知识点有误处望请指正。

计算机网络

一、协议层次以及服务类型

OSI七层模型

开放式通信系统互联参考模型 每一层实现各自的功能和协议,并完成相邻层的接口通信 某一层的服务就是该层以及其下各层的一种能力

1.应用层

通过应用程序间的交互来完成特定的网络应用。 协议定义了应用进程之间的交互规则,通过不同的应用层协议为不同的网络应用提供服务 eg.域名系统DNS,支持万维网的HTTP协议,电子邮件系统采用的SMTP协议等。在应用层交互的数据单元称之为报文

2.表示层

使通信的应用程序能够解释交换数据的含义 向上为应用层提供服务,向下接受来自会话层的服务。 该层提供的服务主要包括数据压缩,数据加密以及数据描述,使得应用程序不必担心在各台计算机中表示和存储的内部格式差异

3.会话层

负责建立、管理和中止表示层实体之间的通信会话 提供了数据交换的定界和同步功能,包括了建立检查点和恢复方案的方法

4.传输层

为两台主机进程之间的通信提供服务。应用程序利用该服务传送应用层报文。 该服务并不针对某一特定的应用,多种应用可以使用同一个传输层服务。 由于一台主机可以同时运行多个线程,因此传输层有复用和分用的功能。 复用:多个应用层进程可以同时使用传出层的服务 分用:传输层把收到的信息分别交付给应用层中的相应进程。

5.网络层(IP层)

两台计算机之间传送数据时其通信链路往往不止一条,所传输的信息甚至可能经过很多通信子网。 网络层的主要任务时选择合适的网间路由和交换节点,确保数据按时成功传送。 发送数据时,网络层把传输层产生的报文或用户数据报封装成分组向下传输到数据链路层。 网络层使用的协议是**无连接的网络协议(Internet Protocol)**和许多路由协议

6.数据链路层(链路层)

两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层协议。 在两个相邻节点之间传送数据时,数据链路层将网络层交下来的IP数据报组装成帧,在两个相邻节点传送帧。每一帧包括数据和必要的控制信息。通过控制信息我们可以知道一个帧的起止比特位置,此外也能使接收端检测出所有收到的帧有无差错,若发现差错,书路链路层能够简单地丢弃掉这个帧,以免继续占用网络资源。

7.物理层

作为OSI参考模型中最低的一层,物理层的作用是实现计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异,使其上面的数据链路层不必考虑网络的具体传输介质是什么。 ​该层的主要任务是确定与传输媒体的接口的一些特性(机械特性、电气特性、功能特性、过程特性)

TCP/IP参考模型

应用层

将OSI参考模型中的应用层、表示层、会话层的功能合并到一个应用层实现 通过不同的应用层协议为不同的应用提供服务 eg.FTP、Telnet、DNS、SMTP等

1.HTTP头部包含哪些信息(***)

本质上是一个传递额外重要信息的键值对 ​

通用头部

是客户端和服务器都可以使用的头部,可以在客户端、服务器和其他应用程序之间提供一些非常有用的通用功能,如Date头部。

请求头部

是请求报文特有的,它们为服务器提供了一些额外信息,比如客户端希望接收什么类型的数据,如Accept头部。

响应头部

便于客户端提供信息,比如,客服端在与哪种类型的服务器进行交互,如Server头部

实体头部

实体头部提供了有关实体及其内容的大量信息,从有关对象类型的信息,到能够对资源使用的各种有效的请求方法。总之,实体头部可以告知接收者它在对什么进行处理。请求消息和响应消息都可以包含实体信息,实体信息一般由实体头域和实体组成。

2.Keep-Alive和非Keep-Alive的区别,对服务器性能有影响吗?(***)

1.非Keep-Alive:
在早期的HTTP/1.0中浏览器每次发起HTTP请求 都需要与服务器创建一个新的TCP连接,服务器完成处理请求以后立即断开TCP连接,服务器不跟踪每个客户,也不记录过去的请求。创建和关闭连接会消耗资源和时间,为减少资源消耗,缩短响应时间,就需要重用连接。
对于非Keep-Alive来说,必须为每一个请求的对象建立和维护一个全新的连接。对于每一个这样的连接,客户机和服务器都要分配TCP缓冲区和变量,会给服务器带来严重的负担。
2.Keep-Alive:HTTP/1.1版本中默认使用持久连接,在此之前的HTTP版本的默认连接都是非持久连接 想要在旧版本上使用持久连接,需要指定connection首部字段的值为Keep-Alive,来告诉对方这个请求响应完成后不要关闭。在 Keep-Alive 方式下,服务器在响应后保持该 TCP 连接打开,在同一个客户机与服务器之间的后续请求和响应报文可通过相同的连接进行传送。甚至位于同一台服务器的多个 Web 页面在从该服务器发送给同一个客户机时,可以在单个持久 TCP 连接上进行。
3.Keep-Alive缺点: 长时间的保持TCP连接容易导致系统资源被无效占用。解决方法:正确配置Keep-Alivetimeout参数,当TCP连接传送完一个HTTP响应之后,该连接还会保持Keep-Alivetimeout秒,之后就关闭这个连接。

3.长连接和短连接的应用场景,长轮询和短轮询(****)

1.首先,http服务依靠传输层实现,长连接实际上指的是TCP连接。(https://blog.csdn.net/luzhensmart/article/details/87186401) 若要实现长连接,需要服务端和客户端的Connection都为Keep-Alive 应用场景长连接:多用于操作频繁,客户端连接数目较少,点对点。(即时通讯,网络游戏等) 短连接:用户数目较多的Web网站(电商网站) 2.长短轮询和长短连接的区别:
** 第一个区别是客户端和服务端
,一个TCP连接是否为长连接,是通过设置HTTP的Connection Header来决定的,而且是需要两边都设置才有效。而一种轮询方式是否为长轮询,是根据服务端的处理方式来决定的,与客户端没有关系。
** 第二个区别就是实现的方式,连接的长短是通过协议来规定和实现的。而轮询的长短,是服务器通过编程的方式手动挂起请求来实现的。
** 3.长短轮询: yyeg.电商网站实时更新商品库存量 短轮询去服务端查询的时侯,不管查询的目标是否发生变化,服务器就立即返回结果了。 长轮询查询时,服务器检测到目标未发生变化的话,会把当前请求挂起一段时间,在这个期间,服务器会检测库存量有没有变化,发生变化就立即返回,否则就一直检测到超时为止。
4.长轮询的缺点: 挂起请求同样会导致资源的浪费,服务端很可能挂起大量的线程不停检测

4.怎么知道HTTP报文的长度(**)

响应消息中存在Content-Length字段时,我们可以直接根据这个值来判断数据是否接收完成。如静态页面或者静态图像时,服务器能够很清楚的知道请求内容的大小。而加载动态 页面时,服务器预先不知道请求内容的大小,就得用Transfer_Encoding:chunked 分块传输编码(Chunked Transfer Encoding)是HTTP/1.1中引入的一种数据传输机制。允许HTTP由服务器发送给客户端的数据可以分成多个部分。当数据分解成一系列数据块发送时,每一个数据块包含十六进制的长度值和数据,最后一个分块的长度值为0,表示实体结束。 对于小点的文件,直接给出 content-length,也就是本次返回的数据长度 对于大文件,使用 Transfer-Encoding:chunked 字段

5.HTTP方法了解哪些(***)

HTTP/1.0 GET(读取数据), POST(提交数据), HEAD(类GET,获取报头,无具体内容)
HTTP/1.1 OPTIONS(返回支持放法), PUT(替换或新增资源), PATCH(小补丁,局部更新), DELETE(删除指定资源), TRACE(服务器回显请求数据), CONNECTION(服务器代理访问)

6.GET和POST的区别(*****)

POST请求的安全性更好:POST 请求的数据参数放在请求体中,G**ET请求的数据放在URL后,会被浏览器记录,容易暴露。**POST请求主要用来提交表单或者修改服务器资源。 POST请求传递大量数据。GET请求的数据主要放在URL中,而URL最大长度为2048(与浏览器有关),所以GET请求 无法传递大量数据。 GET请求只允许传递ASCII字符,POST无限制 GET请求只支持URL编码,POST支持多种编码方式。 GET请求的数据可以作缓存。 例如 IE 浏览器对 URL 的最大限制为 2000多个字符,大概 2KB左右,像 Chrome, FireFox 等浏览器能支持的 URL 字符数更多,其中 FireFox 中 URL 最大长度限制为 65536 个字符,Chrome 浏览器中 URL 最大长度限制为 8182 个字符

7.HTTP和HTTPS的工作方式(****)

HTTP协议(超文本传输协议)是一种简单的请求-响应协议
HTTP使用TCP作为传输层协议,默认工作在TCP协议80端口,TCP连接一旦建立浏览器和服务器就可以通过套接字接口访问TCP,客户端通过套接字接口发送HTTP请求报文,接受HTTP响应报文…通信的内容以明文的方式传输不通过任何方式的数据加密,通信结束后客户端与服务端的连接关闭。
HTTPS是以安全为目标的HTTP协议,在HTTP的基础上通过传输加密身份认证的方式保证了传输过程的安全性。 过程如下:
1.客户端发起HTTPS请求,连接443端口(包括自身支持的加密算法和密钥长度)
2.服务端选择一种双方都支持的加密算法,将它和其它密钥组件一同发送给客户端
3.服务端向客户端发送一个包含数字证书的报文,数字证书包含证书的颁发机构,过期时间,服务端的公钥等信息。
4.服务端发送一个完成报文,通知客户端SSL的第一阶段已经协商完成。
5.SSL第一次协商完成后,客户端发送报文,包含客户端生成的随机密码串(pre_master_secret),并且该报文是经过证书中的公钥加密过的。
6.客户端发送报文,提示在此之后的报文采用pre_master_secret加密
7.客户端向着服务端发送finished报文,包含连接至今所有报文的整体校验值,最终是否完成协商取决于服务端是否能够正常解密该报文作为判定标准。
8.服务端发送提示(Change Cipher Spec)报文
9.服务端发送finished报文告知客户端自己可以正确解密。
双方finish报文交换完毕时,SSL连接就算建立完成,通信过程中采用对称加密的方式。
10: 服务器和客户端的 Finished 报文交换完毕之后,SSL 连接 就算建立完成。当然,通信会受到SSL的保护。从此处开 始进行应用层协议的通信,即发送HTTP 请求。
11: 应用层协议通信,即发送HTTP响应。
最后客户端主动断开时会发送close notify报文 ​实际上就是client用公钥加密,server用私钥解密,加密方式SSL/TLS

8.HTTP和HTTPS的区别(****)

HTTP协议以明文的方式发送内容,数据都是未加密的,安全性较差。不验证通信方身份,无法证明报文完整性。 HTTP+(加密,认证,完整性保护)SSL =HTTPS HTTPS数据传输经过加密,数据安全性较好。 两者使用不同的连接方式,使用的端口也不同。HTTP使用80端口,HTTPS使用443端口 HTTPS需要使用数字认证机构申请证书(CA)证书,一般需要一定的费用。 HTTP页面响应比HTTPS快,HTTP使用三次握手,HTTPS除此之外还需要进行SSL协商。HTTPS比HTTP慢2-100倍

9.为什么相信CA证书(***)

1.服务端向CA认证机构发送公钥,,CA认证机构用自己的私钥向服务器的公开密码署数字签名,并颁发公钥证书。 2.CA认证的公钥已经植入到浏览器中 3.客户端获取服务端响应的公钥后,用本地的CA公钥向CA机构验证公钥证书上的数字签名,来确保服务端的公钥真实 4.使用服务端公钥加密通信 5.服务端用自己的私钥解密

10.如何保存用户状态(****)

1.基于Session实现的会话保持 服务端创建并保存SessionId-Session键值对,将SessionId下发到客户端,客户端将其保存在Cookie中,每次请求都带上这个SessionId,实现会话的保持 优点:安全性高,信息保存在服务端,缺点:分布式多个服务器时,HTTP请求落到不同服务器上就没办法维持会话了。 2.基于Cookie实现的会话保持 服务器发送响应消息时在响应头中设置Set-Cookie字段,存储客户端的状态信息。客户端解析出响应头的字段信息后,根据生命周期创建不同的Cookie,每次请求都携带Cookie字段,实现状态保持。 优点:服务端不用存储状态信息,减轻服务器存储压力 缺点:不够安全,不能够保存重要数据。 如果Cookie被禁用,可以通过重写URL的方式将会话标识放在URL参数里实现会话保持

11.状态码(****)

HTTP状态码由三位十进制数组成,分为五种类型

200 OK_请求成功 201 Created_请求已实现,有一个新的资源依据需求建立 204 No Content_请求成功,无内容 301 永久移动到新的URI 30(2\3\7)临时移动 400 Bad Request_客户端请求的语法错误 401 Unauthorized_当前请求需要用户验证 403 Forbidden_禁止(拒绝)访问 500 服务器错误 502 Bad Gateway_作为网关的服务器从远程服务器接收到无效的响应 503 Service Unavailable_服务器宕机

12.HTTP1.0和HTTP1.1的区别(***)

1.缓存处理 1.1请求头中增加了一些和缓存相关的字段,比如If-Match,可以更加灵活地控制缓存策略
2.长连接 1.0默认浏览器和服务器之间是短连接,服务器发送完之后会直接关闭TCP连接,如果想要复用TCP连接,需要在Connection头部中添加Keep-Alive,1.1默认使用长连接。
3.节约带宽 1.0默认把资源相关的整个对象都发给客户端,但是客户端不需要所有的信息,这就浪费了带宽资源,1.1的请求头引入了Range头域,可以只请求部分资源。
4.错误通知的管理: 1.1增加了一些错误状态响应码(24个)
5.HOST请求头 1.0时,每个服务器都绑定唯一的IP地址,后面出现了虚拟主机,一个物理服务器可以有多个虚拟主机,一起共享同一个IP地址,所以1.1添加了HOST请求头存放主机名,来区分不同的虚拟主机。

13.HTTP/1.X和HTTP2.0的区别(***)

1.二进制传送 之前版本数据都属使用文本传输,2.0采用二进制传送,传输数据时将数据->帧->数据流(包含流ID和优先级),通过优先级和流依赖能够一定程度上解决请求阻塞问题。
2.多路复用 1.1每个请求是串行执行的,当前方请求超时时,后方请求只能等待(线头阻塞);2.0每个请求都有自己的ID,多个请求可以在同一个TCP连接上并行执行。
3.头部(header)压缩: 每次进行HTTP请求响应的时,头部中很多字段都是重复的。2.0将字段记录到一张表中,头部只需要存放字段对应的编号,减少了数据的传输量。
4.服务端推送: ​服务器会在客户端没有发起请求的时候主动推送一些需要的资源。

14.HTTP/3(**)

15.DNS的作用和原理(****)

1.DNS(Domian Name System)域名系统,是和HTTP协议一样位于应用层的协议。提供域名到IP地址之间的解析服务。 计算机可以被赋予主机名和域名/IP地址,访问时用户习惯使用主机名或域名。 DNS协议提供通过域名查找IP地址,或逆向从IP地址反查域名的服务。
拓展:域名解析查询的两种方式
主机名.次级域名.顶级域名.根域名
即host.sld.tld.root
递归查询:如果主机所询问的本地域名服务器不知道被查询域名的 IP 地址,那么本地域名服务器就以 DNS 客户端的身份,向其他根域名服务器继续发出查询请求报文,即替主机继续查询,而不是让主机自己进行下一步查询
迭代查询:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的 IP 地址,要么告诉本地服务器下一步应该找哪个域名服务器进行查询,然后让本地服务器进行后续的查询

16.DNS为什么使用UDP(**)

既使用UDP,也使用TCP 当(区域传送:主域名服务器和辅助域名服务器同步数据)数据同步传送的时侯使用TCP,因为数据同步传送的数据量大,TCP允许的报文长度更长。 域名解析时使用UDP,无需三次握手,加快响应速度。

17.如何实现DNS劫持(***)

DNS劫持即域名劫持,是通过将原域名对应的IP地址进行替换从而使得用户访问到错误的网站,或者使得用户无法正常访问网站的一种攻击方式。域名劫持往往只能在特定的网络范围内进行,范围外的DNS服务器能够返回正常的IP地址。 DDOS,缓存感染,信息劫持,重定向,本机劫持(修改本机DNS缓存)。 如何应对DNS劫持? 网络层面: 1.准备两个以上的域名 2.手动改修改DNS

18.针对Web的攻击技术

HTTP不具备必要的安全功能 几乎现今所有的Web 网站都会使用会话 (session)管理、加密处理等安全性方面的功能,而 HTTP 协议内并不 具备这些功能。 在客户端即可篡改请求 在 HTTP 请求报文内加载攻击代码,就能发起对Web 应用的攻击。 通过 URL 查询字段或表单、HTTP 首部、Cookie 等途径把攻击代码传 入,若这时Web 应用存在安全漏洞,那内部信息就会遭到窃取,或被 攻击者拿到管理权限。 ​

主动攻击

**主动攻击(active attack)**是指攻击者通过直接访问WEB应用,把攻击代码传入的攻击模式。 SQL注入、OS命令注入

SQL注入

是指针对web应用使用的数据库,通过运行非法的SQL而产生的攻击。 有以下影响: 1.非法查看或篡改数据库内的内容 2.规避认证 3.执行和数据库服务器业务相关的程序 何为SQL? SQL 是用来操作关系型数据库管理系统(Relational DataBase Management System,RDBMS)的数据库语言,可进行操作数据或定义 数据等。RDBMS 中有名的数据库有 Oracle Database、Microsoft SQL Server、IBM DB2、MySQL 和 PostgreSQL 等。这些数据库系统都可以 把 SQL 作为数据库语言使用。 使用数据库的Web 应用,通过某种方法将 SQL 语句传给RDBMS,再把RDBMS返回的结果灵活地使用在Web 应用中。

OS注入

被动攻击

**被动攻击(passive attack)**是指利用圈套策略执行攻击代码的攻击模 式。在被动攻击过程中,攻击者不直接对目标Web 应用访问发起攻击。 跨站脚本攻击(XSS)和跨站点请求伪造

19.Socket套接字(***)

套接字(Socket)是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象,网络进程通信的一端就是一个套接字,不同主机上的进程便是通过套接字发送报文来进行通信。例如 TCP 用主机的 IP 地址 + 端口号作为 TCP 连接的端点,这个端点就叫做套接字。 流套接字:基于 TCP 传输协议,主要用于提供面向连接、可靠的数据传输服务。 数据报套接字:基于 UDP 传输协议,对应于无连接的 UDP 服务应用。 原始套接字:用来传送非传输层数据包(例如 Ping 命令时用的 ICMP 协议数据包)或者遇到操作系统无法处理的数据包。

20.URI与URL(***)

URI:统一资源标识符,URL统一资源定位符 URI:在某一规则下把一个资源独一无二的标识出来 URL是URI的子集,可以通过定位的方式完成URI的实现。

21.网页解析过程(*****)

1.DNS解析 用户访问网页,DNS服务器根据提供的域名查找IP地址, 查询过程:浏览器缓存,系统缓存,路由缓存,ISP缓存,递归搜索。
2.TCP连接 通过dns解析的IP地址向web服务器发送TCP连接请求(三次握手)
3.发起HTTP请求 (负载均衡)
4.处理请求并返回响应
5.浏览器渲染 --解析HTML文件

构建DOM树 --获取HTML对象
遇到外部CSS或图片资源,浏览器发送异步请求 遇到JS文件,html会挂起渲染的线程,等待js加载并解析完毕 --CSS解析
6.断开连接(四次挥手)

传输层

对应OSI参考模型的传输层 为上层实体提供源端到对端主机的通信功能。 传输控制协议(TCP)、用户数据报协议(UDP)协议。 面向连接的TCP协议保证了数据的传输可靠性。 面向无连接的UDP协议能够实现数据包简单快速的传输。

22.三次握手和四次挥手(*****)

三次握手

什么是三次握手?
实际上就是TCP连接的建立过程,连接服务器指定端口,建立TCP连接,同步双方序列号和确认号,交换TCP窗口大小信息。 0.在握手之前,主动打开连接的客户端结束 CLOSE 阶段,被动打开的服务器也结束 CLOSE 阶段,并进入 LISTEN 阶段。 1.首先,客户端向服务端发送一条TCP报文段,SYN标志位置为1,同时客户端的TCP程序随机选择一个序号X作为客户端的初始序号ISN(Initial Sequence Number),客户端进入SYN-SENT状态。(不能携带数据)
2.服务端收到这个SYN报文段之后,对该包进行确认后结束LISTEN阶段。为TCP连接分配资源(发送/接受缓存,变量),向客户端发送允许连接的SYNACK报文段,这条报文段将SYN,ACK标志位都置为1,同时将ack确认号置为X+1,服务端随机选择一个seq序号Y作为服务器报文段的初始序号,随后进入SYN-RCVD阶段。(不能携带数据)
3.客户端收到确认连接的SYNACK报文段之后,为TCP连接分配资源,向服务端发送一条ACK报文段,这条报文段SYN标志位置为0,ACK标志位置为1,ack确认号为Y+1,序号为X+1,随后客户端进入ESTABLISHED阶段。
服务端接受到该报文之后结束SYN-RCVD状态,进入ESTABLISHED阶段。 经过这三次握手,TCP连接建立完毕,客户端和服务端就可以相互发送数据了。(可以携带数据)
为什么是三次握手?
TCP连接的建立过程,同时也是客户端和服务端交换序号seq的过程。第一次握手,客户端将自身序号发送给了服务端,第二次握手,服务端确认收到客户端序号的同时将自身序号发送给客户端。如果没有第三次握手,就不确定客户端是否已经收到服务端的序列号,若没有收到,客户端将无法处理之后到达的数据。(第一二次握手证明了客户端的发送能力和服务端的收发能力)

三次握手中的异常处理(****)

半连接队列和全连接队列

**半连接队列:**服务端在第一次收到客户端的SYN报文段之后会进入SYN_RCVD(在收到和发送一个建立连接请求后等待确认)状态,这个时候客户端和服务端还没有完全建立连接,服务器会把此种状态下请求连接放在一个队列里。 全连接队列:三次握手已经完成,建立起的连接就会存放在全连队列中,如果队列已满,服务端会根据tcp_abort_on_overflow参数来处理该连接,0则丢弃,1则发送RST给客户端,放弃此次连接。就可能出现丢包现象。

SYN攻击

服务器端的资源分配是在第二次握手时分配的,客户端对TCP连接的资源分配是在第三次握手中分配的。 SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server则回复确认包,并等待Client确认,由于源地址不存在,因此Server需要不断重发直至超时(每次重传等待的事件不一定相同),这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪。SYN 攻击是一种典型的 DoS/DDoS 攻击 SYN攻击防范 通过防火墙过滤网关保护 通过加固TCP/IP协议栈进行防护–>缩短超时时间,增加最大半连接数

四次挥手

TCP在断开连接的时候,客户端和服务端之间要交换四次报文 四次挥手是TCP断开连接时要交换四次数据 1.如果客户端是主动断开的一方的话,客户端向着服务端发送一个FIN报文段,将FIN标志位置为1,同时将自身seq序列号,ack确认号发送给服务端。(这里的seq其实就是数据交换过程中客户端的序列号加客户端向服务端发送数据的长度,确认号是确认200状态码包)此时客户端进入FIN_WAIT1状态。 2.然后服务端像客服端发送ACK报文段同意断开连接,将自身seq序列号,ack确认号发送给客户端。这里的ack确认号就是第一次挥手的序列号+1,seq序列号是200状态码包的序列号+数据长度。 因为TCP连接是一个全双工连接,第一二次挥手之后客户端朝至服务端方向的连接断开,但是服务端向客户端的连接没有断开,服务端仍可以向客户端发送数据。 3.服务端向客户端发送FIN报文段,请求断开连接。seq序列号是第二次挥手的序列号加上期间服务端向客户端发送的数据长度。ack确认号仍是第二次挥手的确认号。 4.客户端向着服务端发送一条ACK报文段,seq是第一次挥手的seq+1,ack是第三次挥手seq序列号+1 然后客户端等待2MSL之后断开连接 ​

为什么客户端要等待2MSL后才断开连接

MSL是最大报文生存时间。 保证服务端接受客户端最后发送的ACK包。 留下2MSL是客户端发出ACK的生存时间和服务器重传的FIN的生存时间,如果2MSL后客户端仍没有收到服务端重传的FIN说明服务器已经收到客户端发送的ACK, 就是至少允许报文丢失一次*,也可以避免新旧连接的混淆*(新旧报文冲突)。如果B重传一直失败(多次丢包的概率很低,可以忽略),tcp_fin_timeout 60s直接断连。·

为什么要四次挥手

TCP连接是全双工连接,在主动关闭方发送 FIN 包后,接收端可能还要发送数据,不能立即关闭数据通道,所以也就不能将服务器端的 FIN 包与对客户端的 ACK 包合并发送,只能先确认 ACK,然后服务器待无需发送数据时再发送 FIN 包,所以四次挥手时必须是四次数据包的交互。

如果服务端发起断开连接的请求

高并发的情况下,服务器会积累很多TIME-WAIT状态,浪费资源。 可以使用SO_REUSEADDR套接字让端口在TIME_WAIT状态下被再次重用。

数据传输过程

23.TCP和UDP的区别(*****)

24.TCP如何保证可靠性(*****)

数据分块:应用数据被分割成 TCP 认为最适合发送的数据块。
序列号和确认应答:TCP 给发送的每一个包进行编号,在传输的过程中,每次接收方收到数据后,都会对传输方进行确认应答,即发送 ACK 报文,这个 ACK 报文当中带有对应的确认序列号,告诉发送方成功接收了哪些数据以及下一次的数据从哪里开始发。除此之外,接收方可以根据序列号对数据包进行排序,把有序数据传送给应用层,并丢弃重复的数据。
校验和: TCP 将保持它首部和数据部分的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到报文段的检验和有差错,TCP 将丢弃这个报文段并且不确认收到此报文段。
流量控制: TCP 连接的双方都有一个固定大小的缓冲空间,发送方发送的数据量不能超过接收端缓冲区的大小。当接收方来不及处理发送方的数据,会提示发送方降低发送的速率,防止产生丢包。TCP 通过滑动窗口协议来支持流量控制机制
拥塞控制: 当网络某个节点发生拥塞时,减少数据的发送。
ARQ协议: 也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组
超时重传: 当 TCP 发出一个报文段后,它启动一个定时器,等待目的端确认收到这个报文段。如果超过某个时间还没有收到确认,将重发这个报文段。

超时重传

发送方在发送一次数据后就开启一个定时器在一定时间内如果没有得到发送数据包的 ACK 报文,**那么就重新发送数据,在达到一定次数还没有成功的话就放弃重传并发送一个复位信号。**定时时间过长会造成网络利用率不高,定时太短会造成多次重传,使得网络阻塞。在 TCP 连接过程中,会参考当前的网络状况从而找到一个合适的超时时间。

停止等待



该协议指的是发送方每发完一组数据后,直到收到接收方的确认信号才继续发送下一组数据

序列号和确认应答

拥塞控制(*****)

有了TCP的窗口控制,收发主机之间即使不再以一个数据段为单位发送确认应答,也能够连续发送大量数据包。然而,如果在通信刚开始时就发送大量数据,也可能会引发其他问题。 一般来说,计算机网络都处在一个共享的环境。因此也有可能会因为其他主机之间的通信使得网络拥堵。在网络出现拥堵时,如果突然发送一个较大量的数据,极有可能会导致整个网络的瘫痪。TCP为了防止该问题的出现,在通信一开始时就会通过一个叫做慢启动的算法得出的数值,对发送数据量进行控制。
拥塞控制是作用于网络的,它是防止过多的数据注入到网络中,避免出现网络负载过大的情况。常用的解决方法有:慢开始和拥塞避免、快重传和快恢复。

慢开始

开始时先探测网络拥塞程度 随着包的每次往返,拥塞窗口也会以1、2、4等指数函数的增长,拥堵状况激增甚至导致网络拥塞的发生 ​为了防止拥塞窗口增长过大而引起网络拥塞,另外设置了一个慢开始门限 ssthresh。 ① 当 cwnd < ssthresh 时,使用上述的慢开始算法; ② 当 cwnd > ssthresh 时,停止使用慢开始,转而使用拥塞避免算法; ③ 当 cwnd == ssthresh 时,两者均可。

拥塞避免

拥塞避免 拥塞控制是为了让拥塞窗口 cwnd 缓慢地增大,即每经过一个往返时间 RTT (往返时间定义为发送方发送数据到收到确认报文所经历的时间)就把发送方的 cwnd 值加 1,通过让 cwnd 线性增长,防止很快就遇到网络拥塞状态。

快恢复

当网络拥塞快重传发生时,让新的慢开始门限值变为发生拥塞时候的值的一半,并将拥塞窗口置为 1 ,然后再次重复两种算法(慢开始和拥塞避免),这时一瞬间会将网络中的数据量大量降低。

窗口大小和滑动窗口

流量控制&窗口大小

TCP提供一种机制可以让发送端根据接收端的实际接收能力控制发送的数据量。这就是所谓的流控制。它的具体操作是,接收端主机向发送端主机通知自己可以接收数据的大小,于是发送端会发送不超过这个限度的数据。该大小限度就被称作窗口大小。窗口大小的值就是由接收端主机决定的。

窗口控制与重发控制(高速重发机制–快重传

滑动窗口

发送数据中高亮圈起的部分正是前面所提到的窗口。
在这个窗口内的数据即便没有收到确认应答也可以发送出去。
此外,从该窗口中能看到的数据因其某种数据已在传输中丢失,所以发送端才能收到确认应答,这种情况也需进行重发。
为此,发送端主机在等到确认应答返回之前,必须在缓冲区中保留这部分数据。
在滑动窗口以外的部分包括尚未发送的数据以及已经确认对端已收到的数据。
当数据发出后若如期收到确认应答就可以不用再进行重发,此时数据就可以从缓存区清除。
收到确认应答的情况下,将窗口滑动到确认应答中的序列号的位置。
这样可以顺序地将多个段同时发送提高通信性能。这种机制也被称为滑动窗口控制。

25.UDP 为什么是不可靠的?bind 和 connect 对于 UDP 的作用是什么(***)

1.UDP 只有一个 socket 接收缓冲区,没有 socket 发送缓冲区即只要有数据就发,不管对方是否可以正确接收。
而在对方的 socket 接收缓冲区满了之后,新来的数据报无法进入到 socket 接受缓冲区,此数据报就会被丢弃
,因此 UDP 不能保证数据能够到达目的地,此外,UDP 也没有流量控制和重传机制,故UDP的数据传输是不可靠的。
2.UDP 中调用 connect 只是把对端的 IP 和 端口号记录下来,并且 UDP 可多次调用 connect 来指定一个新的 IP 和端口号,或者断开旧的 IP 和端口号(通过设置 connect 函数的第二个参数)。和普通的 UDP 相比,调用 connect 的 UDP 会提升效率,并且在高并发服务中会增加系统稳定性
3.当 UDP 的发送端调用 bind 函数时,就会将这个套接字指定一个端口,若不调用 bind 函数,系统内核会随机分配一个端口给该套接字。当手动绑定时,能够避免内核来执行这一操作,从而在一定程度上提高性能。

SYN粘包问题和拆包问题

1.当发送端写入的数据大于接受端缓冲区时,拆包
2.依据MSS对TCP报文分段的时候,拆包
3.发送端发送数据太快或将多个分组一起发送的时候,粘包
解决方案:设置消息边界

网际互联层

对应OSI参考模型的网络层,主要负责相同或不同网络中计算机之间的通信。 在网际互联层,IP协议提供的是一个不可靠,无连接的数据报传递服务。 该协议实现两个基本功能:寻址和分段。 根据数据报报头中的目的地址将数据传送到目的地址,这个过程中IP负责选择传送路线。 主要协议:IP协议、互联网组管理协议(IGMP)、互联网控制报文协议(ICMP)

网络接口层(网络访问层)

对应OSI参考模型中的物理层数据链路层。负责监视数据在主机和网络之间的交换。 TCP/IP 并未真正描述这一层的实现,而由参与互连的各网络使用自己的物理层和数据链路层协议,然后与 TCP/IP 的网络接入层进行连接,因此具体的实现方法将随着网络类型的不同而有所差异。

TCP/IP五层参考模型

五层体系协议结构包括应用层传输层网络层数据链路层物理层。 其中应用层对应OSI的上三层,下四层和OSI相同。 只是为介绍网络原理而设计的。

OSI模型和TCP/IP模型异同比较(****)

相同点

1.OSI参考模型与TCP/IP参考模型都采用了层次结构 2.都能够提供面向连接和无连接两种通信服务机制

不同点

1.OSI参考模型是七层模型,TCP/IP参考模型是四层结构
2.OSI模型将网络划分为七层,实现困难;TCP/IP参考模型作为一种简化的分层结构比较成功。
3.TCP/IP没有对网络接口层进行细分,OSI参考模型对服务和协议作了明确的区分
4.OSI先有模型后有协议规范,适用于描述各种网络,TCP/IP是先有协议集然后建立模型,不适用于非TCP/IP网络 5.TCP/IP一开始就提出面向连接和无连接服务,而OSI一开始只强调面向连接服务,直到很晚才开始制定无连接的服务标准。

OSI和TCP/IP协议之间的对应关系(****)

1.为什么TCP/IP模型去除了表示层和会话层?(**)
实际上,由于会话层、表示层、应用层都是在应用程序内部实现的,最终产出的是一个应用数据包,而应用程序之间是几乎无法实现代码的抽象共享的,这也就造成 OSI 设想中的应用程序维度的分层是无法实现的,所以在后来的 TCP/IP 协议框架的设计中,便将表示层和会话层与应用层整合在一起,让整个过程更为清晰明了。
三层都在应用程序内部实现,程序间无法共享,合三为一

2.数据如何在各层之间传输?(***)
在发送主机端,一个** 应用层报文被传送到传输层**。 传输层收取到报文并附上附加信息,该首部将被接收端的传输层使用。 应用层报文和传输层首部信息构成了传输层报文段。附加的信息可能包括:允许接收端传输层向上、向适当的应用程序交付报文的信息以及差错检测位信息。该信息让接收端能够判断报文中的比特是否在途中已被改变。传输层则向网络层传递该报文段,网络层增加了如源和目的端系统地址等网络层首部信息,生成了网络层数据报。 网络层数据报传递给链路层,在数据链路层数据包添加发送端MAC地址和接收端MAC地址后被封装成数据帧,在物理层数据帧被封装为比特流,通过传输介质传送到对端。 应用层报文—>传输层报文段—>网络层数据报—>数据帧 —> 比特流 应用层 —>传输层 —>网络层 —>数据链路层—>物理层
让接收端能够判断报文中的比特是否在途中已被改变。传输层则向网络层传递该报文段,网络层增加了如源和目的端系统地址等网络层首部信息,生成了网络层数据报。 网络层数据报传递给链路层,在数据链路层数据包添加发送端MAC地址和接收端MAC地址后被封装成数据帧,在物理层数据帧被封装为比特流,通过传输介质传送到对端。 应用层报文—>传输层报文段—>网络层数据报—>数据帧 —> 比特流 应用层 —>传输层 —>网络层 —>数据链路层—>物理层

图文字浅谈--计算机网络常遇的面试问题(计网面经)相关推荐

  1. 计算机网络在教学上的应用,浅谈计算机网络在教学中的应用.doc

    浅谈计算机网络在教学中的应用 精品论文 参考文献 浅谈计算机网络在教学中的应用 冯 娟 湖北省咸丰县忠堡镇民族中学 445600 随着现代科学技术的飞速发展,现代信息技术以其生动形象.图像清晰.色彩艳 ...

  2. 计算机网络浅谈,浅谈计算机网络的重要性

    浅谈计算机网络的重要性 摘要:当现代社会逐渐变为具有高度的相互依赖的巨大网络时,我们所生活的世界无法不变成一个被计算机网络紧密联结起来的世界.计算机网络从技术角度来说,是作为一种布局,将经有关联但相距 ...

  3. 浅谈计算机网络的未来发展趋势

    浅谈计算机网络的未来发展趋势 前言 学习主要内容 计算机网络的发展 计算机网络的未来趋势 在线多媒体技术 网络应用更趋多样化 业务综合化 无线传输介质将成主流 计算机的智能革命 学习结论 参考文献 前 ...

  4. 计算机网络仿真技术概述,浅谈计算机网络仿真技术及其研究

    浅谈计算机网络仿真技术及其研究 来源:用户上传 作者: 摘要:在信息化和工业化相互促进的现代化进程中,计算机网络仿真技术将逐步深入到国民经济的各个领域,并将扮演越来越重要的角色.该文正是基于此背景,对 ...

  5. 计算机网络技术对教学的作用,浅谈计算机网络技术在教学应用中的作用和发展趋势.docx...

    浅谈计算机网络技术在教学应用中的作用和发展趋势 乜大伟 (山东医学高等专科学校,山东临沂276000 ) [摘要]计算机网络技术在教学中应用的推广,新型教学模式对传统教育思想. 教学观念.教学方法产生 ...

  6. 浅谈计算机网络,浅谈计算机网络的发展

    浅谈计算机网络的发展 摘要:计算机网络一直在不断地更新,也在快速的发展.计算机网络技术的不断提升,也使得其他的各行各业在计算机方面的应用也越来越受到重视,计算机网络的应用也充斥到了日常生活和工作中.除 ...

  7. PHP字符串转数字面试,浅谈php字符串反转 面试中经常遇到的问题

    下面小编就为大家分享一篇浅谈php字符串反转 面试中经常遇到的问题,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 1.单字节字符串反转 php提供了用于字符串反转的函数strrev( ...

  8. 浅谈计算机网络及交换机基础配置

    @浅谈计算机网络1 本文主要面对网络工程的同学请见谅 同时也是一些常识吧 有问题的话欢迎私信 简介 什么是计算机网络? -硬件方面:通过线缆链接将网络设备和计算机连接起来 -软件方面:操作系统,应用软 ...

  9. 计算机网络数据通信论文,浅谈计算机网络与数据通信的发展

    浅谈计算机网络与数据通信的发展 随着计算机网络技术与多媒体通信技术的广泛运用,数据通信是行业发展的必然趋势,下面是小编搜集整理的一篇探究计算机网络与数据通信发展的论文范文,欢迎阅读查看. 摘 要:数据 ...

最新文章

  1. 14条改善jquery代码的建议
  2. 计算机c1 c语言答题,全国计算机级考试二级C语言上机答题技巧.doc
  3. AI人工智能的未来?AI科技与AI教程?答案都在这里!
  4. Linux常用命令行
  5. 【转】基本概念:过拟合、修剪、假正、假负
  6. 开放地址法实现HashTable
  7. Windows多线程编程总结
  8. 从一副漫画说编码思维,编码习惯,编码风格 (条件判断,死代码,true 或false)
  9. Elasticsearch之type底层结构及弃用原因
  10. SpringBoot基础重难点
  11. .NET Core ConfigureServices
  12. Linux中文件权限的一些知识
  13. HDU - 3247 Resource Archiver (AC自动机,状压dp)
  14. 数据结构-链表4-企业链表
  15. iOS开发之注册推送通知权限
  16. LINUX下system和execl有什么差异?
  17. 系统安装:D-Link DWL-G122 USB无线网卡驱动安装配置
  18. 计算机硬件故障视频,电脑提示“没有视频硬件”怎么办
  19. 页面关闭时postback,导致IE假死的分析
  20. Java中的其他常用类(Math类,Scanner类、正则表达式)

热门文章

  1. 虫师Selenium2+Python_4、webdriver API
  2. 海康设备对接——高抛
  3. 计算机毕业设计django基于python的汽车租赁系统
  4. mysql htop大量进程,htop与dstat
  5. 受邀出席线性资本投资者会议,闪马智能CEO彭垚分享AI赋能城市应用
  6. Nordic芯片如何达到最快的蓝牙传输速率
  7. shell之find
  8. TL494电源芯片使用记录分享
  9. 亚马逊MWS开发--上传商品常见错误
  10. 阿里董事局主席张勇:数字化建设将成为新发展方向