【总结】计算机网络常见问题

1、TCP/IP协议与OSI协议

  相互通信的两个计算机系统必须高度协调工作才行,而这种“协调”是相当复杂的。 “分层”可将庞大而复杂的问题,转化为若干较小的局部问题,而这些较小的局部问题就比较易于研究和处理。

  计算机网络采用了分层的体系结构,有两种国际标准,国际标准化组织ISO提出的开放系统互连参考模型就是OSI,是规定的国际标准,它是一个七层协议的体系结构。

  虽然是由ISO提出的国际标准,但是OSI在市场方面失败了,原因在于层次划分过多,有些层的功能重复,没有及时的得到市场,所以使得TCP/IP成为了事实上的标准。


1608161-20190702225428545-1379384024.jpg

  而TCP/IP实际上是一个四层协议,我们常说的五层协议是将网络接口层分为了物理层和数据链路层,综合了OSI和TCP/IP,主要在学习时便于理解。


1608161-20190702225948532-132474049.jpg

2、OSI的会话层和表示层

  OSI和TCP/IP相比,主要就是多了会话层和表示层。

  会话层的主要功能就是在发送方和接收方之间创建、维持、终止连接,类似于电路通信,负责两个网络参与者之间进行的通信,它之下的传输层TCP协议也有连接的概念,他们的关系是一个会话连接可以对应0个、1个或者多个TCP连接。

  表示层的主要功能是负责数据的表示,在不同的数据格式之间进行转换,负责加密和解密,负责文件的压缩等数据的表示任务。

3、TCP/IP协议每一层的主要功能

  物理层:提供物理介质,主要负责在连接各种计算机的传输媒体上传输数据比特流,负责的相关的电气接口的一些定义(机械特性、电气特性、功能特性、过程特性),还负责信道的复用等等与物理介质相关的任务。

  数据链路层:主要任务是封装成帧、透明传输和差错检测,在一段链路上组成帧进行传送。

  网络层:负责主机和主机之间的通信,主要任务是寻址、路由选择、分组和重组,主要设备是路由器。

  传输层:负责在两个主机的应用进程之间进行数据传输,TCP和UDP。

  应用层:通过应用进程之间的交互来完成各种应用任务,如http、ftp、telnet、smtp等等。

4、ARP地址解析协议

  ARP是地址解析协议,用于实现从 IP 地址到 MAC 地址的映射,即询问目标IP对应的MAC地址。具体原理这里不细说了,需要注意的是它是一个三层协议,是一个网络层协议。

5、TCP和UDP的比较

  UDP是用户数据报协议,它的主要特点是:(1)无连接 (2)使用尽最大努力的交付 (3)面向报文 (4)没有拥塞控制 (5)支持一对一、一对多、多对一和多对多的交互通信 (6)首部开销小,只有8个字节 (7)适合抢带宽的一些业务模型

  TCP是传输控制协议,主要特点是:(1)它是面向连接的 (2)每一条TCP连接只有两个端点 (3)提供可靠交付的保证 (4)提供全双工通信 (5)面向字节流

6、TCP三次握手,为什么需要第三次,三次握手有什么隐患

  三次握手的过程如下图所示:


1608161-20190702225516232-1976713245.png

  三次握手的过程很熟悉了,主要是为什么还需要第三次呢?

  第三次握手是对确认的确认,它的目的主要是为了防止已失效的接请求报文段突然又传到了B,从而会引发一些错误,浪费一些资源。具体的,如果A发出一个连接请求,并没有丢失,而是在网络中某个地方滞留了,A在一段时间后等不到B的ACK就会重新发起请求,如果过一段时间那个滞留的请求又到了B,B会对它进行ACK,如果没有第三次确认,B发出ACK就认为已经建立了连接,会耗费资源来维护这条连接,而实际上这是一个已经失效的链接,所以使用第三次握手可以避免这个问题,A收到ACK以后会知道这是一个失效的链接,不再对其进行确认,B也就不会认为建立了连接。

  三次握手有什么隐患呢?

  三次握手由于需要发起方进行一次请求、一次确认,这存在一定的隐患,是DDos攻击的一种常用手段,黑客可以通过伪装身份发起连接请求,在发起请求之后就不管了,不进行第二次的确认,而服务端由于迟迟收不到请求方的ACK,就会认为是自己发出的ACK丢失了,不断的进行重传,导致这条连接处于一个半开连接的状态,当有大量的这种情况发生时,大量的半开连接占满了连接队列,服务器的资源都耗费在维护这些半开连接上,使得正常的服务请求无法得到响应。

7、TCP四次挥手,为什么需要四次

  四次挥手的过程如下图所示:


1608161-20190702225534901-1214126962.png

  四次挥手的过程也比较熟悉了,主要问题是为什么需要四次呢?

  这里我们可以看到,当A没有数据要发送时,就发起FIN请求,在连接时B可以将对请求的ACK和自己的SYN请求一起发过去,而释放连接却不一样了,因为此时虽然A没有数据要发送了,而B很有可能还有一些数据没有发送完,只能先对A的FIN进行一个ACK,此时处于一个半关闭状态,等到自己将该发送的数据都发送完之后,在发起从B到A这个方向的链接释放请求,因此需要四次。

8、TCP释放连接的各个状态变化,Time Wait和close wait状态出现在哪里?

  注意一下TCP四次挥手时的状态变化,释放请求发起方在发出FIN请求后,进入FIN-WAIT-1状态,收到ACK以后进入FIN-WAIT-2状态,收到B的FIN并进行确认以后进入Time WAIT状态

  而服务器方,在收到FIN发出ACK之后,进入Close WAIT状态,这时是一个半关闭状态,从A到B这个方向已经释放了,随后B将还需要传输的数据发送完毕,发出FIN请求,等待最后一个ACK,进入Last-ACK状态,收到以后就释放连接,进入closed状态。

9、为什么需要Time Wait状态,没有Time Wait状态会发生什么,Time Wait状态过多的话如何解决

  Time Wait这个状态需要保持2MSL(最长报文段寿命)的时间,这个状态存在以及持续这么长时间的主要目的有两个:

  (1)确保最后发出的这个ACK能够正确的到达B,如果丢失,在Time Wait的这段时间内有足够的时间进行重传,因为这个ACK如果丢失,B迟迟收不到ACK,就会认为是自己发出的FIN请求丢失了,就会重传FIN,如果A不维持一段时间直接关闭,那么B永远收不到ACK,就无法正确的进入closed状态。

  (2)防止已失效的连接请求报文段在这里出现。Time Wait时间足够长,就可以使得在本次连接中所产生的报文段都从网络中消失,这样就可以不正确的处理掉那些失效的连接请求报文段。

  Time Wait过多的话,可以通过设置Socket地址重用来解决,允许复用同一个地址。

10、TCP是如何保证可靠传输的

  TCP中大量的机制都设计用来确保可靠传输,主要包括:

  (1)确认和超时重传。接收方收到报文就会确认,发送方发送一段时间后没有收到确认就重传。

  (2)数据校验。

  (3)滑动窗口机制

  (4)流量控制:发送方的窗口大小由接收方控制

  (5)拥塞控制:当网络拥塞时,减少数据的发送。

11、TCP的流量控制和拥塞控制

  流量控制所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收,所以发送窗口的大小必须小于等于接收窗口的大小,也就是由接收方来控制。

  在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏,产生拥塞。拥塞控制是一个全局性的过程,涉及到所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。

  TCP提出了一系列的拥塞控制方法。发送方维持一个叫做拥塞窗口 cwnd的状态变量,发送方让自己的发送窗口等于拥塞窗口,再考虑到接收方的接收能力,发送窗口的大小就取拥塞窗口和接收窗口中的较小值

1、慢启动和拥塞避免
  慢启动和拥塞避免如下图所示:


1608161-20190702225609480-1950566202.png

2、快重传和快恢复

  快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认。这样做可以让发送方及早知道有报文段没有到达接收方。 发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,不需要等待超时计时器了,快重传并非取消重传计时器,而是在某些情况下可更早地重传丢失的报文段。


1608161-20190702225633108-1515531276.png

12、NAT地址转换

  NAT最大的贡献就是节省了大量的ip资源,缓解了IP地址枯竭的问题。分为静态(使用一个公网地址)和动态(一个地址池)。


1608161-20190702225650745-668515334.png

转载于:https://www.cnblogs.com/gzshan/p/11123686.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362120.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

webpack3的CommonsChunkPlugin插件详解

webpack打出来的包在不做处理的情况下是非常大的,所有依赖都被塞进一个文件中,文件中有业务代码,有业务代码依赖的第三方库代码,还有webpack生成的运行时代码等。这样的一个文件不方便静态资源缓存,并且初始化页面的时…

详细介绍jQuery.outerWidth() 函数具体用法

outerWidth()函数用于设置或返回当前匹配元素的外宽度。外宽度默认包括元素的内边距(padding)、边框(border),但不包括外边距(margin)部分的宽度。你也可以指定参数为true,以包括外边距(margin)部分的宽度。如下图: 如果你要获取其它情况的宽…

SQLite 入门教程(一)基本控制台(终端)命令

一、基本简介 SQLite 是一个自持的(self-contained)、无服务器的、零配置的、事务型的关系型数据库引擎。因为他很小,所以也可以作为嵌入式数据库内建在你的应用程序中。SQLite 被应用在 Solaris 10操作系统、Mac OS 操作系统、iPhone 和 Sky…

Web前端开发css基础样式总结

颜色和单位的使用 颜色 用颜色的名字表示颜色,比如:red 用16进制表示演示 比如:#FF0000 用rgb数值表示颜色,rgb(红,绿,蓝),每个值都在0-255之间 一般都用16进制表示颜色 单位 1. px像素(Pixel)。像素,与分辨率…

nth-child(n)和nth-of-type(n)

:nth-child(n)&#xff1a;父元素的子元素的第n个 :nth-of-type(n)&#xff1a;父元素的 某类 子元素的第n个 注&#xff1a;n从0起&#xff0c;元素index从1起 nth-child(n)和nth-of-type(n)例&#xff1a; <head><style>body :nth-child(2) {height: 30px;ba…

记录您的里程和社区运行情况:Java EE 7真实体验

miles2run.org是跟踪跑步活动并与亲朋好友共享的简便方法。 可以创建然后跟踪基于天或基于距离的目标。 它还允许创建社区运行目标&#xff0c;并使多个跑步者参与并跟踪他们朝着该目标的活动。 您也可以找出本地跑步者并与他们联系。 该项目已开始&#xff0c;以帮助跟踪#Jav…

oracle在group by时某列有多个值的拼接

最近编码过程中出现了group by后&#xff0c;某些列会有多个值&#xff0c;而我需要把这些多个值的列进行拼接的情况&#xff0c;和大家分享一下。 有如下表student&#xff1a; 我们希望以class分组&#xff0c;每组的信息平铺&#xff0c;效果如下 分组首先想到的肯定是group…

在Spring中使用Asciidoctor:使用Spring MVC渲染Asciidoc文档

Asciidoc是一种基于文本的文档格式&#xff0c;因此如果要将文档提交到版本控制系统中并跟踪不同版本之间的更改&#xff0c;它非常有用。 这使Asciidoc成为编写书籍&#xff0c;技术文档&#xff0c;常见问题解答或用户手册的理想工具。 创建Asciidoc文档后&#xff0c;很可能…

http强缓存在firefox和chrome之间的差异

最近回顾HTTP缓存知识的时候发现了一个问题&#xff0c;设置了强缓存和协商缓存的文件&#xff0c;点击浏览器的刷新按钮的时候在chrome和firefox中的表现不一样。具体表现为chrome走强缓存没有再次发起请求。firefox却在强缓存没有失效的情况下发了请求&#xff0c;返回了304走…

垃圾收集器–串行,并行,CMS,G1(以及Java 8中的新增功能)

4个Java垃圾收集器–错误的选择如何严重影响性能 在2014年&#xff0c;对于大多数开发人员来说&#xff0c;还有两件事仍然是个谜&#xff1a;垃圾收集和了解异性。 由于我对后者知之甚少&#xff0c;所以我认为我会对前者大吃一惊&#xff0c;特别是因为在该领域中&#xff0c…

基于webpack的react脚手架

一、前言&#xff1a;react的cli开发模式太过于简单&#xff0c;好多东西都要自己配置 二、这里有个简单的配置&#xff0c;可以直接上手开发(不熟悉webpack和npm的绕路)&#xff0c;已经完成的配置如下 1&#xff1a;默认ejs模板 2&#xff1a;编译less、scss 3&#xff1…

不要错过使用jOOλ或jOOQ编写Java 8 SQL单行代码的机会

越来越多的人通过为他们的业务采用功能性编程来赶上我们平台的最新更新。 在Data Geekery &#xff0c;我们将Java 8用于jOOQ集成测试&#xff0c;因为将新的Streams API与lambda表达式一起使用使生成临时测试数据变得非常容易。 但是&#xff0c; 我们并不认为JDK提供了尽可…

node实现简单的群体聊天工具

一、使用的node模块 1、express当做服务器 2、socket.io 前后通信的桥梁 3、opn默认打开浏览器的模块(本质上用不到) 难点&#xff1a;前后通信 源码地址&#xff1a;https://github.com/wjf444128852/SimpleChat 欢迎clone并运行、扩展改进、issues 二、基础样子&#…

使用Spring Security的多租户应用程序的无状态会话

从前&#xff0c; 我发表了一篇文章&#xff0c;解释了构建无状态会话的原理 。 巧合的是&#xff0c;我们再次针对多租户应用程序执行同一任务。 这次&#xff0c;我们将解决方案集成到Spring Security框架中&#xff0c;而不是自己构建身份验证机制。 本文将解释我们的方法和…

What?一个 Dubbo 服务启动要两个小时!

前言 前几天在测试环境碰到一个非常奇怪的与 dubbo 相关的问题&#xff0c;事后我在网上搜索了一圈并没有发现类似的帖子或文章&#xff0c;于是便有了这篇。 希望对还未碰到或正在碰到的朋友有所帮助。 现象 现象是这样的&#xff0c;有一天测试在测试环境重新部署一个 dubbo …

使用Project Lombok减少Java应用程序中的样板代码

对Java编程语言最常提出的批评之一是它需要大量的样板代码 。 对于简单的类尤其如此&#xff0c;该类只需要存储一些值就可以。 您需要这些值的getter和setter&#xff0c;也许您还需要一个构造函数&#xff0c;覆盖equals&#xff08;&#xff09;和 hashcode&#xff08;&am…

十六、CI框架之数据库操作get用法

一、使用数据库的Get方法读取内容&#xff0c;如下代码&#xff1a; 二、数据库如下&#xff1a; 二、效果如下&#xff1a; 转载于:https://www.cnblogs.com/tianpan2019/p/11141809.html

WCF系列(二) -- 使用配置文件构建和使用WCF服务

当然&#xff0c;配置一个ServiceHost除了上面说的完全使用代码的方式&#xff0c;更好的方式是使用配置文件&#xff0c;把一些可能需要修改的属性跟代码分离&#xff0c;放到配置文件中&#xff0c;这样可以提供服务配置的灵活性&#xff0c;也更容易维护。 看看前面那个不用…

如何使用github搭建个人博客

1、去github官网注册个人帐号&#xff1a;没有的&#xff1a;猛戳这里去注册&#xff0c;比如我的账户名&#xff1a;wjf444128852&#xff0c;我的已经汉化(可在github里搜索github如何汉化有插件) 2、点击仓库-新建&#xff0c;仓库名字必须是&#xff1a;你的github帐号.git…

Spring Boot和Spring Data REST –通过REST公开存储库

使用Spring Boot和Spring Data REST&#xff0c;通过REST公开Spring Data存储库非常容易。 使用最少的代码&#xff0c;您可以创建遵循HATEOAS原理的JPA实体的REST表示。 我决定重用Spring PetClinic的JPA实体&#xff08;业务层&#xff09;作为本文的基础。 应用基础 PetCli…