前言:
我们所在学习的基础知识一定不是在浪费时间,而是在培养我们计算机专业眼光下的科学世界观.不管是世界上任何一种主流语言,都是语言.我们作为语言的使用者,怎样去使用语言才应该是重中之重.而不是因为学会了语法就开始沾沾自喜.我们要清楚地明白代码背后的底层逻辑.知其然,更知其所以然
最后 欢迎大家加入秃头大军,愿大家顺丰顺水,一路长虹
计算机408四大板块之间的联系
1. 计算机组成原理
计算机组成原理位于最底层,它最贴近底层的硬件实现。计算机到底是怎么算出1 1=2的?我敲键盘上的字母,计算机是怎么接收的?(一个键还好说,我还按shift 1打出感叹号呢)屏幕上的指针为什么和我的鼠标操作配合得那么好?电子游戏和网络视频那些花花绿绿的东西到底是怎么呈现的?
这些问题都是很有趣的问题,更有趣的是,尽管我们不清楚这些问题的答案,但是照样能够玩计算机玩得很6。可计算机系的同学不能停留在知其然的阶段,还需要知其所以然。
计算机组成原理就是为了让我们理解“计算机机箱里的那些东西,加上鼠标键盘屏幕等等部件,是如何配合起来,作为计算机整体来工作的”。我觉得这个板块虽然很难,但也是最激动人心的,因为这个板块实际上是在直接利用大自然的规律,处处有涌现的现象。日后再谈。
2. 操作系统
操作系统位于中间层,它是计算机资源的管理者。为什么需要操作系统这个管理者?因为资源是有限的,而任务又很复杂。
我说资源有限,是因为一台计算机说白了就是几千克的机器,它能以计算机的肉身在宇宙中存在的时间也不过那么一段。尽管里面有运算设备、存储设备、各种线路等等好多东西,但终究是有限的。CPU运算速率有上限,存储空间有上限,线路带宽有上限。
我说任务复杂,不光是指有些任务涉及操作较多、难度较大,还是指任务常常来自于不同的用户、不同的进程,任务开始派发的时间不同,对资源的要求不同,对空间、时效的要求也不同。贪婪的人类,为了解决自己现实生活中的种种可计算问题,几乎要把计算机掏空。
而操作系统,就是为了让计算机能够更好地利用有限资源去完成复杂任务才产生的。换个角度来看,人类在计算机中设计操作系统,就是为了让计算机好好听话认真干事,就是为了更加高效地利(bo)用(xue)计算机。
3. 数据结构
最上层是数据结构,它与用户最近,与现实问题最近。数据结构实际上是为了完成对现实问题的最佳抽象,这种抽象结果一方面要和现实的逻辑相符,另一方面要和计算机的实现能力相配。前者就是数据结构中说的“逻辑结构”,后者就是数据结构中说的“物理结构”。这其实是个挺矛盾的事情,毕竟逻辑和物理还是有鸿沟的。
好的数据结构能够尽可能高效地完成给定问题,能作为“面向对象编程”中那个理想的对象。
4. 计算机网络
计算机网络,可以看做一条网线,强调它在计算机通讯中起的关键作用。前面已经说过计算机有I/O接口,因此它具有开放性,能实现信息的输入输出。我们知道,信息并不是直接从发送方嗖的无损闪现到发送方那儿去的,必须要经过信道,因此就必然会有时延、有损失、可能产生错误。可是开放是必须的,你肯定不喜欢没联网的计算机对吧,因此不论多难也要实现计算机之间的通讯。
计算机网络的最终目的就是要实现计算机之间的有效通讯。通过一系列网络协议,计算机之间得以拥有共同的沟通法则,能够处在一套话语体系之下。在此基础上,计算机们对数据进行打包、分组、转送、检错、反馈、修正……多么有效的沟通!
沟通场景有多复杂,网络协议就有多复杂。这个板块注定有很多人为的规定需要记忆,幸好网络搭建的原则总是共通的,有相似的模式可以归纳。
1>ISO/OSI参考模型及各层使用协议
物理层、数据链路层协议(传输单位比特/帧)
1、远距离蜂窝通信
(1)2G/3G/4G通信协议,分别指第二、三、四代移动通信系统协议。
(2)NB-IoT
窄带物联网(Narrow Band Internet of Things, NB-IoT)成为万物互联网络的一个重要分支。NB-IoT构建于蜂窝网络,只消耗大约180kHz的带宽,可直接部署于GSM网络、UMTS网络或LTE网络,以降低部署成本、实现平滑升级。NB-IoT聚焦于低功耗广覆盖(LPWA)物联网(IoT)市场,是一种可在全球范围内广泛应用的新兴技术。具有覆盖广、连接多、速率快、成本低、功耗低、架构优等特点。
应用场景:NB-IoT网络带来的场景应用包括智能停车、智能消防、智能水务、智能路灯、共享单车和智能家电等。
(3)5G
第五代移动通信技术,是最新一代蜂窝移动通信技术。5G的性能目标是高数据速率、减少延迟、节省能源、降低成本、提高系统容量和大规模设备连接。
应用场景:AR/VR、车联网、智能制造、智慧能源、无线医疗、无线家庭娱乐、联网无人机、超高清/全景直播、个人AI辅助、智慧城市。
2、远距离非蜂窝通信
(1)WiFi
由于前几年家用WiFi路由器以及智能手机的迅速普及,WiFi协议在智能家居领域也得到了广泛应用。WiFi协议最大的优势是可以直接接入互联网。相对于ZigBee,采用Wifi协议的智能家居方案省去了额外的网关,相对于蓝牙协议,省去了对手机等移动终端的依赖。
商用WiFi在城市公共交通、商场等公共场所的覆盖,将商用WiFi的场景应用潜力表露无疑。
(2)ZigBee
ZigBee是一种低速短距离传输的无线通信协议,是一种高可靠的无线数传网络,主要特色有低速、低耗电、低成本、支持大量网上节点、支持多种网上拓扑、低复杂度、快速、可靠、安全。ZigBee技术是一种新型技术,它最近出现,主要是依靠无线网络进行传输,它能够近距离的进行无线连接,属于无线网络通讯技术
ZigBee技术的先天性优势,使得它在物联网行业逐渐成为一个主流技术,在工业、农业、智能 家居等领域得到大规模的应用。
(3)LoRa
LoRa™(LongRange,远距离)是一种调制技术,与同类技术相比,提供更远的通信距离。LoRa 网关、烟感、水监测、红外探测、定位、排插等广泛应用物联网产品。作为一种窄带无线技术,LoRa 是使用到达时间差来实现地理定位的。LoRa 定位的应用场景:智慧城市和交通监控、计量和物流、农业定位监控。
3、近距离通信
(1)RFID
射频识别(RFID)是 Radio Frequency Identification 的缩写。其原理为阅读器与标签之间进行非接触式的数据通信,达到识别目标的目的。RFID 的应用非常广泛,典型应用有动物晶片、汽车晶片防盗器、门禁管制、停车场管制、生产线自动化、物料管理。完整的RFID系统由读写器(Reader)、电子标签(Tag)和数据管理系统三部分组成。
(2)NFC
NFC的中文全称为近场通信技术。NFC是在非接触式射频识别(RFID)技术的基础上,结合无线互连技术研发而成,它为我们日常生活中越来越普及的各种电子产品提供了一种十分安全快捷的通信方式。NFC中文名称中的“近场”是指临近电磁场的无线电波。
应用场景:应用在门禁、考勤、访客、会议签到、巡更等领域。NFC具有人机交互、机器间交互等功能。
(3)Bluetooth
蓝牙技术是一种无线数据和语音通信开放的全球规范,它是基于低成本的近距离无线连接,为固定和移动设备建立通信环境的一种特殊的近距离无线技术连接。
蓝牙能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换。利用“蓝牙”技术,能够有效地简化移动通信终端设备之间的通信,也能够成功地简化设备与因特网Internet之间的通信,从而数据传输变得更加迅速高效,为无线通信拓宽道路。
4、有线通信
(1)USB
USB,是英文Universal Serial Bus(通用串行总线)的缩写,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。是应用在PC领域的接口技术。
(2)串口通信协议
串口通信协议是指规定了数据包的内容,内容包含了起始位、主体数据、校验位及停止位,双方需要约定一致的数据包格式才能正常收发数据的有关规范。在串口通信中,常用的协议包括RS-232、RS-422和RS-485。
串口通信是指外设和计算机间,通过数据线按位进行传输数据的一种通讯方式。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。大多数计算机(不包括笔记本)都包含两个RS-232串口。串口通信也是仪表仪器设备常用的通信协议。
(3)以太网
以太网是一种计算机局域网技术。IEEE组织的IEEE 802.3标准制定了以太网的技术标准,它规定了包括物理层的连线、电子信号和介质访问层协议的内容。
(4)MBus
MBus 远程抄表系统(symphonic mbus),是欧洲标准的2线的二总线, 主要用于消耗测量仪器诸如热表和水表系列。
网络层、传输协议
1、IPv 4
互联网通信协议第四版,是网际协议开发过程中的第四个修订版本,也是此协议第一个被广泛部署的版本。IPv4是互联网的核心,也是使用最广泛的网际协议版本
2、IPv6
互联网协议第6版,由于IPv4最大的问题在于网络地址资源有限,严重制约了互联网的应用和发展。IPv6的使用,不仅能解决网络地址资源数量的问题,而且也解决了多种接入设备连入互联网的障碍
IPV4和IPV6对比
1)采用无差别的编制,CRS是IP地址的分配更加合理,
2)是采用网络地址转换方法以节省全球IP地址t
3)采用具有更大地址空间的新版本的IPv6,其中前两种方法只是延长了IPv4地址分配结束的时间,只有第三种方法,从根本上解决了IP地址的耗尽问题.
IPv6的主要特点如下:
1)更大的地址空间IPv6,将地址从IPv4的32位增大到了128位,IPv6的字节数是IPv4字节数的平方。
2)拓展的地址层次结构
3)灵活的首部格式
4)改进的选项
5) 允许协议继续扩充,
6)支持即插即用,
7)支持资源的预分配
8)IPv6只有在包的源节点才能分片是端到端的传输路径中的路由器不能分片,所以从一般意义上说,IPv6不允许分片.
9)IPv6,首部长度必须是8B的整数倍,而IPv4首部是4B的整数倍。
10)增大了安全性身份验证和保密功能是IPv6的关键特征
虽然IPv6与IPv4不兼容,但总体而言,它与所有其他的因特网协议兼容,包括TCP UDP ICMP I gmp OS p f bg p和DNS,只是在少数地方做个必要的修改。IP会有相当好的满足了预定的目标.
IPv6地址
IPv6数据报的目的,地址可以是以下三种基本类型,地址之一,单播就是传统的点对点通信。多播是一点对多点的通信分组被交付到一组计算机的每台计算机任博,这是IPv6增加的一种类型,任播的目的站是一组计算机,但数据报在交付时只交付其中的一台计算机,通常是距离最近的一台计算机
IPv4,地址通常使用点分十进制表示法,如果IPv6也使用这种表示法,那么地址书写起来将会相当长,在IPv6标准中指定了一种比较紧凑的表示法,即把地址中的每四位用一个16进制数表示,并用冒号分隔每16位。通常可以把IPv6地址缩写成更紧凑的形式,当时16位域的开头有一些0,可以采用一种缩写表示法,但在域中至少有一个数字
当有相继的0值域还可以进一步缩写,这些域可以用双冒号缩写,当然,双冒号表示法在一个地址中仅能出现一次,因为0值域的个数没有编码,需要从指定的总的域的个数来推算,这样一来。前述地址就可以被更紧凑的书写。IPv6拓展了IPv4地址的分级概念,它使用以下三个等级,第一等级指明,全球都知道了公共拓扑,第二集指明单个长点,第三集指明单个网络接口
IPv4向IPv6过渡,只能采用逐步演进的办法,同时,还必须使新安装的IPv6系统能够向后兼容,IPv6系统必须能够接收和转发IPv4分组,并且能够为IPv4分组选择路由
IPv4向IPv6过渡,可以采用双协议栈和隧道技术两种策略,双协议站式只在完全过渡到IPv6之前,使一部分主机或者是路由器装有两个协议栈及一个IPv4和一个IPv6通过双协议栈进行转换,隧道技术是将整个IPv6数据包封装到IPv4数据报的数据部分,使得IPv6数据包可以在IPv4网络的隧道中传输.
3、tcp
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP旨在适应支持多网络应用的分层协议层次结构。连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。TCP假设它可以从较低级别的协议获得简单的,可能不可靠的数据报服务。
4、6LoWPAN
6LoWPAN是一种基于IPv6的低速无线个域网标准,即IPv6 over IEEE 802.15.4。
应用层协议
1、MQTT协议
MQTT (Message Queue Telemetry Transport),翻译成中文就是,遥测传输协议,其主要提供了订阅/发布两种消息模式,更为简约、轻量,易于使用,特别适合于受限环境(带宽低、网络延迟高、网络通信不稳定)的消息分发,属于物联网(Internet of Thing)的一个标准传输协议。
在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。
2、CoAP协议
CoAP(Constrained Application Protocol)是一种在物联网世界的类Web协议,适用于需要通过标准互联网网络进行远程控制或监控的小型低功率传感器,开关,阀门和类似的组件,服务器对不支持的类型可以不响应
3、REST/HTTP协议
RESTful是一种基于资源的软件架构风格。所谓资源,就是网络上的一个实体,或者说是网络上的一个具体信息。一张图片、一首歌曲都是一个资源。RESTful API是基于HTTP协议的一种实现。(HTTP是一个应用层的协议,特点是简捷 快速)。
满足Rest规范的应用程序或设计就是RESTful,根据Rest规范设计的API,就叫做RESTful API
4、DDS协议
DDS(Data Distribution Service)分布式实时数据分发服务中间件协议,它是分布式实时网络里的“TCP/IP”,用来解决实时网络中的网络协议互联,其作用相当于“总线上的总线”。
DDS是OMG在2004年发布的中间件协议和应用程序接口(API)标准,它为分布式系统提供了低延迟、高可靠性、可扩展的通信架构标准。DDS目前在工业、医疗、交通、能源、国防领域都有广泛的应用。OMG(Object Management Group)成立于1989年,是一个开放性的非营利性的计算机行业标准联盟。OMG多年来致力于为工业分布式系统提供可互操作的,可移植的,可复用的软件标准。它的成员包括IT行业的设备供应商,终端用户,政府部门,以及学术组织等。很多我们熟知的标准都来自OMG,比如UML(Unified Modeling Language),CORBA(Common Object Request Broker Architecture)等。
去年关于SOME/IP的文章中我们曾简单解释过中间件的概念,即在分布式系统中,中间件是位于操作系统和用户应用程序之间的软件层,它将操作系统提供的资源进行抽象和封装,为应用程序提供各种各样的高级的服务和功能,比如通信或数据共享。中间件的存在简化了应用程序开发者的工作,这使他们能够将注意力放在应用程序本身上,而不必在不同应用程序之间或不同系统之间的数据传输上花太多精力。
DDS最重要的特性是以数据为中心,这是与其他很多通信中间件不同的地方。DDS的数据共享以Topic为单元,应用程序能够通过Topic判断其所包含的数据类型,而不必依赖其他的上下文信息。同时,DDS能够按照用户定义的方式自动地进行存储、发布或订阅数据,使应用程序能够像访问本地数据一样去写入或者读取数据。
DDS实现的数据共享可以理解成一个抽象的“全局数据空间”,任何应用程序,不论开发语言,或者运行的操作系统类型,都可以通过相同的方式访问这个“全局数据空间”,就好像访问本地的存储空间一样。当然“全局数据空间”仅仅是一个抽象的概念,在实现时仍然是分别存储在每个应用程序的本地空间当中。在系统运行时,数据是按需传输或存储的,数据的发布者仅仅发送对方需要的数据,而订阅者仅接收并存储本地应用程序当前需要的数据。
DDS还提供了非常灵活的QoS(Quality of Service)策略,以满足用户对数据共享方式的不同需求,比如可靠性,故障处理等等。针对数据安全性要求比较高的系统,DDS还提供了细颗粒度的数据安全控制,包括应用程序身份认证,权限控制,数据加密等等。
类似于SOME/IP-SD,DDS提供了对数据发布者和订阅者的动态发现机制,这意味着用户不必去配置通信节点的地址或其他属性信息,因为他们在运行的过程中会自动发现对方,并自动完成相关配置,即实现了“即插即用“。
5、AMQP协议
AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。Erlang中的实现有RabbitMQ等。
AMQP像是一个把东西连在一起的语言,而不是一个系统。其设计目标是:让服务端可通过协议编程。理解了AMQP的这个设计目标,也就能够理解其协议的设计思路了。
AMQP协议是一个二进制协议,具有一些现代特性:多通道(multi-channel),可协商(negotiated),异步、安全、便携、语言中立、高效的。其协议主要分成两层:
功能层(Functional Layer):定义了一系列的命令
传输层(Transport Layer):携带了从应用 → 服务端的方法,用于处理多路复用、分帧、编码、心跳、data-representation、错误处理。
这样分层之后,可以把传输层替换为其它传输协议,而不需要修改功能层。同样,也可以使用同样的传输层,基于此实现不同的上层协议。可能RabbitMQ也是因为类似的原因,能够比较容易的支持MQTT、STOMP等协议的吧。
6、XMPP协议
XMPP是一种基于标准通用标记语言的子集XML的协议,它继承了在XML环境中灵活的发展性。因此,基于XMPP的应用具有超强的可扩展性。经过扩展以后的XMPP可以通过发送扩展的信息来处理用户的需求,以及在XMPP的顶端建立如内容发布系统和基于地址的服务等应用程序。
7.FTP协议
文件传输协议(FTP协议)是因特网上使用最广泛的文件传输协议.FTP提供交互式的访问,允许客户指明文件的类型与格式,并允许文件具有寻去权限.它屏蔽了各计算机系统的细节,因而是合于异构网络中的任意计算机之间传送文件.
TCP网络常见知识
1>网络的七层模型,简单介绍每层的作用?
答案:分为7层,从下到上依次是:
- 应用层:计算机用户与网络之间的接口,常见的协议有:HTTP(万维网)、FTP(文件传输)、 SMTP(电子邮件)、TELNET(远程终端接入)
- 表示层:数据的表示、安全、压缩。将应用处理的信息转换为适合网络传输的格式。
- 会话层:建立和管理本地主机与远程主机之间的会话。
- 传输层:定义传输数据的协议端口号,以及流控和差错校验,保证报文能正确传输。协议有TCP、UDP
- 网络层:路由选择算法,进行逻辑地址寻址,实现不同网络之间的最佳路径选择。协议有IP、ICMP
- 数据链路层:接收来自物理层的位流形式的数据,并封装成帧,传送到上一层;同样,也将来自上层的数据帧,拆装为位流形式的数据转发到物理层。这一层的数据叫做帧。
- 物理层:建立、维护、断开物理连接。传输比特流(将1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。
TCP 报文首部有哪些字段?
- 源端口、目的端口:各占2个字节,表示数据从哪个进程来,去往哪个进程
- 序号(Sequence Number):占4个字节,TCP连接中传送的数据每一个字节都会有一个序号
- 确认号(Acknowledgement Number):占4个字节,另一方发送的tcp报文段的响应
- 数据偏移:头部长度,占4个字节,表示TCP报文段的数据距离TCP报文段的起始处有多远。
- 6位标志位:
- URG:紧急指针是否有效
- ACK:表示确认号是否有效
- PSH:提示接收端应用程序立刻将数据从tcp缓冲区读走
- RST:表示要求对方重新建立连接
- SYN:这是一个连接请求或连接接受的报文
- FIN:告知对方本端要关闭连接
- 窗口大小:占4个字节,用于TCP流量控制。告诉对方本端的TCP接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。
- 校验和:占2个字节,由发送端填充,接收端对TCP报文段执行CRC算法以检验TCP报文段在传输过程中是否损坏。检验的范围包括头部、数据两部分,是TCP可靠传输的一个重要保障。
- 紧急指针:占2个字节,一个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一个字节的序号,用于发送端向接收端发送紧急数据。
TCP 三次握手过程?
- 第一次握手:客户端请求建立连接,向服务端发送一个同步报文(SYN=1),同时选择一个随机数 seq = x 作为初始序列号,并进入SYN_SENT状态,等待服务器确认。
- 第二次握手::服务端收到连接请求报文后,如果同意建立连接,则向客户端发送同步确认报文(SYN=1,ACK=1),确认号为 ack = x 1,同时选择一个随机数 seq = y 作为初始序列号,此时服务器进入SYN_RECV状态。
- 第三次握手:客户端收到服务端的确认后,向服务端发送一个确认报文(ACK=1),确认号为 ack = y 1,序列号为 seq = x 1,客户端和服务器进入ESTABLISHED状态,完成三次握手。
理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。
答案:目的是同步连接双方的序列号和确认号,并交换TCP窗口。
为什么是三次握手,而不是两次或四次?
答案:
如果只有两次握手,那么服务端向客户端发送 SYN/ACK 报文后,就会认为连接建立。但是如果客户端没有收到报文,那么客户端是没有建立连接的,这就导致服务端会浪费资源。
使用两次握手无法建立 TCP 连接,而使用三次握手是建立连接所需要的最小次数
主要有三个原因:
- 防止已过期的连接请求报文突然又传送到服务器,因而产生错误和资源浪费。在双方两次握手即可建立连接的情况下,假设客户端发送 A 报文段请求建立连接,由于网络原因造成 A 暂时无法到达服务器,服务器接收不到请求报文段就不会返回确认报文段。客户端在长时间得不到应答的情况下重新发送请求报文段 B,这次 B 顺利到达服务器,服务器随即返回确认报文并进入 ESTABLISHED 状态,客户端在收到 确认报文后也进入 ESTABLISHED 状态,双方建立连接并传输数据,之后正常断开连接。此时姗姗来迟的 A 报文段才到达服务器,服务器随即返回确认报文并进入 ESTABLISHED 状态,但是已经进入 CLOSED 状态的客户端无法再接受确认报文段,更无法进入 ESTABLISHED 状态,这将导致服务器长时间单方面等待,造成资源浪费。
- 三次握手才能让双方均确认自己和对方的发送和接收能力都正常。第一次握手:客户端只是发送处请求报文段,什么都无法确认,而服务器可以确认自己的接收能力和对方的发送能力正常;第二次握手:客户端可以确认自己发送能力和接收能力正常,对方发送能力和接收能力正常;第三次握手:服务器可以确认自己发送能力和接收能力正常,对方发送能力和接收能力正常;可见三次握手才能让双方都确认自己和对方的发送和接收能力全部正常,这样就可以愉快地进行通信了。
- 告知对方自己的初始序号值,并确认收到对方的初始序号值。TCP 实现了可靠的数据传输,原因之一就是 TCP 报文段中维护了序号字段和确认序号字段,通过这两个字段双方都可以知道在自己发出的数据中,哪些是已经被对方确认接收的。这两个字段的值会在初始序号值的基础递增,如果是两次握手,只有发起方的初始序号可以得到确认,而另一方的初始序号则得不到确认。
三次握手连接阶段,最后一次ACK包丢失,会发生什么?
服务端:
- 第三次的ACK在网络中丢失,那么服务端该TCP连接的状态为SYN_RECV,并且会根据 TCP的超时重传机制,会等待3秒、6秒、12秒后重新发送SYN ACK包,以便客户端重新发送ACK包。
- 如果重发指定次数之后,仍然未收到 客户端的ACK应答,那么一段时间后,服务端自动关闭这个连接。
客户端:
客户端认为这个连接已经建立,如果客户端向服务端发送数据,服务端将以RST包(Reset,标示复位,用于异常的关闭连接)响应。此时,客户端知道第三次握手失败。
TCP 四次挥手的过程?
答案:
- 第一次挥手:客户端向服务端发送连接释放报文(FIN=1,ACK=1),主动关闭连接,同时等待服务端的确认。
- 序列号 seq = u,即客户端上次发送的报文的最后一个字节的序号 1
- 确认号 ack = k, 即服务端上次发送的报文的最后一个字节的序号 1
- 第二次挥手:服务端收到连接释放报文后,立即发出确认报文(ACK=1),序列号 seq = k,确认号 ack = u 1。这时 TCP 连接处于半关闭状态,即客户端到服务端的连接已经释放了,但是服务端到客户端的连接还未释放。这表示客户端已经没有数据发送了,但是服务端可能还要给客户端发送数据。
- 第三次挥手:服务端向客户端发送连接释放报文(FIN=1,ACK=1),主动关闭连接,同时等待 A 的确认。
- 序列号 seq = w,即服务端上次发送的报文的最后一个字节的序号 1。
- 确认号 ack = u 1,与第二次挥手相同,因为这段时间客户端没有发送数据
- 第四次挥手:客户端收到服务端的连接释放报文后,立即发出确认报文(ACK=1),序列号 seq = u 1,确认号为 ack = w 1。此时,客户端就进入了 TIME-WAIT 状态。注意此时客户端到 TCP 连接还没有释放,必须经过 2*MSL(最长报文段寿命)的时间后,才进入 CLOSED 状态。而服务端只要收到客户端发出的确认,就立即进入 CLOSED 状态。可以看到,服务端结束 TCP 连接的时间要比客户端早一些。
为什么连接的时候是三次握手,关闭的时候却是四次握手?
服务器在收到客户端的 FIN 报文段后,可能还有一些数据要传输,所以不能马上关闭连接,但是会做出应答,返回 ACK 报文段.
接下来可能会继续发送数据,在数据发送完后,服务器会向客户单发送 FIN 报文,表示数据已经发送完毕,请求关闭连接。服务器的ACK和FIN一般都会分开发送,从而导致多了一次,因此一共需要四次挥手。
为什么需要四次挥手?
答案:TCP 是全双工。一方关闭连接后,另一方还可以继续发送数据。所以四次挥手,将断开连接分成两个独立的过程。
什么是 SYN洪泛攻击?如何防范?
SYN洪泛攻击属于 DOS 攻击的一种,它利用 TCP 协议缺陷,通过发送大量的半连接请求,耗费 CPU 和内存资源。
原理:
- 在三次握手过程中,服务器发送 [SYN/ACK] 包(第二个包)之后、收到客户端的 [ACK] 包(第三个包)之前的 TCP 连接称为半连接(half-open connect),此时服务器处于 SYN_RECV(等待客户端响应)状态。如果接收到客户端的 [ACK],则 TCP 连接成功,如果未接受到,则会不断重发请求直至成功。
- SYN 攻击的攻击者在短时间内伪造大量不存在的 IP 地址,向服务器不断地发送 [SYN] 包,服务器回复 [SYN/ACK] 包,并等待客户的确认。由于源地址是不存在的,服务器需要不断的重发直至超时。
- 这些伪造的 [SYN] 包将长时间占用未连接队列,影响了正常的 SYN,导致目标系统运行缓慢、网络堵塞甚至系统瘫痪。
检测:当在服务器上看到大量的半连接状态时,特别是源 IP 地址是随机的,基本上可以断定这是一次 SYN 攻击。
防范:
- 通过防火墙、路由器等过滤网关防护。
- 通过加固 TCP/IP 协议栈防范,如增加最大半连接数,缩短超时时间。
- SYN cookies技术。SYN Cookies 是对 TCP 服务器端的三次握手做一些修改,专门用来防范 SYN 洪泛攻击的一种手段。
客户端 TIME-WAIT ,为什么要等待 2MSL 才进入 CLOSED 状态?
答案:主要有两个原因:
- 确保 ACK 报文能够到达服务端,从而使服务端正常关闭连接。第四次挥手时,客户端第四次挥手的 ACK 报文不一定会到达服务端。服务端会超时重传 FIN/ACK 报文,此时如果客户端已经断开了连接,那么就无法响应服务端的二次请求,这样服务端迟迟收不到 FIN/ACK 报文的确认,就无法正常断开连接。MSL 是报文段在网络上存活的最长时间。客户端等待 2MSL 时间,即「客户端 ACK 报文 1MSL 超时 服务端 FIN 报文 1MSL 传输」,就能够收到服务端重传的 FIN/ACK 报文,然后客户端重传一次 ACK 报文,并重新启动 2MSL 计时器。如此保证服务端能够正常关闭。如果服务端重发的 FIN 没有成功地在 2MSL 时间里传给客户端,服务端则会继续超时重试直到断开连接。
- 防止已失效的连接请求报文段出现在之后的连接中。
TCP 要求在 2MSL 内不使用相同的序列号。客户端在发送完最后一个 ACK 报文段后,再经过时间 2MSL,就可以保证本连接持续的时间内产生的所有报文段都从网络中消失。这样就可以使下一个连接中不会出现这种旧的连接请求报文段。或者即使收到这些过时的报文,也可以不处理它。
如果已经建立了连接,但是客户端出现故障了怎么办?
或者说,如果三次握手阶段、四次挥手阶段的包丢失了怎么办?如“服务端重发 FIN丢失”的问题。
简而言之,通过定时器 超时重试机制,尝试获取确认,直到最后会自动断开连接。
具体而言,TCP 设有一个保活计时器。服务器每收到一次客户端的数据,都会重新复位这个计时器,时间通常是设置为 2 小时。若 2 小时还没有收到客户端的任何数据,服务器就开始重试:每隔 75 分钟发送一个探测报文段,若一连发送 10 个探测报文后客户端依然没有回应,那么服务器就认为连接已经断开了。
TIME-WAIT 状态过多会产生什么后果?怎样处理?
从服务器来讲,短时间内关闭了大量的Client连接,就会造成服务器上出现大量的TIME_WAIT连接,严重消耗着服务器的资源,此时部分客户端就会显示连接不上。
从客户端来讲,客户端TIME_WAIT过多,就会导致端口资源被占用,因为端口就65536个,被占满就会导致无法创建新的连接。
TIME_WAIT 是服务器端的状态?还是客户端的状态?
TIME_WAIT 是主动断开连接的一方会进入的状态,一般情况下,都是客户端所处的状态;服务器端一般设置不主动关闭连接。
TIME_WAIT 需要等待 2MSL,在大量短连接的情况下,TIME_WAIT会太多,这也会消耗很多系统资源。对于服务器来说,在 HTTP 协议里指定 KeepAlive(浏览器重用一个 TCP 连接来处理多个 HTTP 请求),由浏览器来主动断开连接,可以一定程度上减少服务器的这个问题。
TCP协议如何保证可靠性?
TCP主要提供了检验和、序列号/确认应答、超时重传、滑动窗口、拥塞控制和 流量控制等方法实现了可靠性传输。
- 检验和:通过检验和的方式,接收端可以检测出来数据是否有差错和异常,假如有差错就会直接丢弃TCP段,重新发送。
- 序列号/确认应答:序列号的作用不仅仅是应答的作用,有了序列号能够将接收到的数据根据序列号排序,并且去掉重复序列号的数据。TCP传输的过程中,每次接收方收到数据后,都会对传输方进行确认应答。也就是发送ACK报文,这个ACK报文当中带有对应的确认序列号,告诉发送方,接收到了哪些数据,下一次的数据从哪里发。
- 滑动窗口:滑动窗口既提高了报文传输的效率,也避免了发送方发送过多的数据而导致接收方无法正常处理的异常。
- 超时重传:超时重传是指发送出去的数据包到接收到确认包之间的时间,如果超过了这个时间会被认为是丢包了,需要重传。最大超时时间是动态计算的。
- 拥塞控制:在数据传输过程中,可能由于网络状态的问题,造成网络拥堵,此时引入拥塞控制机制,在保证TCP可靠性的同时,提高性能。
- 流量控制:如果主机A 一直向主机B发送数据,不考虑主机B的接受能力,则可能导致主机B的接受缓冲区满了而无法再接受数据,从而会导致大量的数据丢包,引发重传机制。而在重传的过程中,若主机B的接收缓冲区情况仍未好转,则会将大量的时间浪费在重传数据上,降低传送数据的效率。所以引入流量控制机制,主机B通过告诉主机A自己接收缓冲区的大小,来使主机A控制发送的数据量。流量控制与TCP协议报头中的窗口大小有关。
详细讲一下TCP的滑动窗口?
在进行数据传输时,如果传输的数据比较大,就需要拆分为多个数据包进行发送。TCP 协议需要对数据进行确认后,才可以发送下一个数据包。这样一来,就会在等待确认应答包环节浪费时间。
为了避免这种情况,TCP引入了窗口概念。窗口大小指的是不需要等待确认应答包而可以继续发送数据包的最大值。
从上面的图可以看到滑动窗口左边的是已发送并且被确认的分组,滑动窗口右边是还没有轮到的分组。
滑动窗口里面也分为两块,一块是已经发送但是未被确认的分组,另一块是窗口内等待发送的分组。随着已发送的分组不断被确认,窗口内等待发送的分组也会不断被发送。整个窗口就会往右移动,让还没轮到的分组进入窗口内。
可以看到滑动窗口起到了一个限流的作用,也就是说当前滑动窗口的大小决定了当前 TCP 发送包的速率,而滑动窗口的大小取决于拥塞控制窗口和流量控制窗口的两者间的最小值。
详细讲一下拥塞控制?
TCP 一共使用了四种算法来实现拥塞控制:
- 慢开始 (slow-start);
- 拥塞避免 (congestion avoidance);
- 快速重传 (fast retransmit);
- 快速恢复 (fast recovery)。
发送方维持一个叫做拥塞窗口cwnd(congestion window)的状态变量。当cwndssthresh时,改用拥塞避免算法。
慢开始:不要一开始就发送大量的数据,由小到大逐渐增加拥塞窗口的大小。
拥塞避免:拥塞避免算法让拥塞窗口缓慢增长,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1而不是加倍。这样拥塞窗口按线性规律缓慢增长。
快重传:我们可以剔除一些不必要的拥塞报文,提高网络吞吐量。比如接收方在收到一个失序的报文段后就立即发出重复确认,而不要等到自己发送数据时捎带确认。快重传规定:发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。
快恢复:主要是配合快重传。当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把ssthresh门限减半(为了预防网络发生拥塞),但接下来并不执行慢开始算法,因为如果网络出现拥塞的话就不会收到好几个重复的确认,收到三个重复确认说明网络状况还可以。
一台 8G 内存服务器,可以同时维护多少个连接?
答案:发送、接收缓存各4k,还要考虑socket描述符,一个tcp连接需要占用的最小内存是8k,那么最大连接数为:8*1024*1024 K / 8 K = 1048576 个,即约100万个tcp长连接。
什么是拆包?
答案:传输层封包不能太大,基于这个限制,往往以缓冲区大小为单位,将数据拆分成多个 TCP 段(TCP Segment)传输。在接收数据的时候,一个个 TCP 段又被重组成原来的数据。简单来讲分为几个过程:拆分——传输——重组。
什么是粘包?
答案:解决数据太小问题,防止多次发送占用资源。TCP 协议将它们合并成一个 TCP 段发送,在目的地再还原成多个数据。
缓冲区是做什么用?
答案:缓冲区是在内存中开辟的一块区域,目的是缓冲。当应用频繁地通过网卡收、发数据,网卡只能一个一个处理。当网卡忙不过来的时候,数据就需要排队,也就是将数据放入缓冲区。
注意:TCP Segment 的大小不能超过缓冲区大小。
TCP 协议是如何保证数据的顺序?
大数据拆包成多个片段,发送可以保证有序,但是由于网络环境复杂,并不能保证它们到达时也是有序的,为了解决这个问题,对每个片段用Sequence Number编号,接收数据的时候,通过 Seq 进行排序。
注意:seq是累计的发送字节数
TCP 协议如何解决丢包?
答案:丢包需要重发,关键是如何判断有没有丢包!
每一个数据包,接收方都会给发送方发响应。每个 TCP 段发送时,接收方已经接收了多少数据,用 Acknowledgement Number(简写ACK) 表示。
注意:ack是累计的接收字节数,表示这个包之前的包都已经收到了。
什么是 MSS(最大报文段长度) ?
答案:MSS 全称 Maximun Segment Size。是TCP Header 中的可选项(Options),控制了 TCP 段的大小,不能由单方决定,需要双方协商。
TCP 协议如何控制流量传输速度?
答案:简单讲通过滑动窗口。发送、接收窗口的大小可以用来控制 TCP 协议的流速。窗口越大,同时可以发送、接收的数据就越多,吞吐量也就越大。但是窗口越大,如果数据发生错误,损失也就越大,因为需要重传越多的数据。
TCP每个请求都要有响应,如果一个请求没有收到响应,发送方就会认为这次发送出现了故障,会触发重发。为了提升吞吐量,一个TCP段再没有收到响应时,可以继续发送下一个段。
窗口区域包含两类数据:已发送未确认、未发送(即将发送)- 窗口中序号最小的分组如果收到 ACK,窗口就会向右滑动
- 滑动窗口的size规格可能会变化,需要从ACK数据包实时取最新值
- 如果最小序号的分组长时间没有收到 ACK,就会触发整个窗口的数据重新发送
HTTP(超文本传输协议) 1.0 、1.1 和 HTTP 2.0 有什么区别?
答案:
1、HTTP 1.0
- 默认是短连接,每次与服务器交互,都需要新开一个连接。
2、HTTP 1.1
- 默认持久化连接,建立一次连接,多次请求均由这个连接完成。
3、HTTP 2.0
- 二进制分帧:在应用层和传输层之间加了一个二进制分帧层,将所有传输的信息分割为更小的消息和帧(frame),并对它们采用二进制格式的编码。减少服务端的压力,内存占用更少,连接吞吐量更大
- 多路复用:允许同时通过单一的HTTP/2.0连接发起多次的请求-响应消息。
- 头部压缩:采用了Hpack头部压缩算法对Header进行压缩,减少重复发送。
- 服务器推送:服务器主动将一些资源推送给浏览器并缓存起来。
HTTP 与 http 的区别?
答案:http = HTTP SSL/TLS
- HTTP 采用明文通讯;端口 80
- http 在HTTP的基础上加入了SSL/TLS协议,SSL/TLS依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。端口 443
HTTP 协议为什么要设计成无状态?
答案:HTTP是一种无状态协议,每个请求都是独立执行,请求/响应。这样设计的重要原因是,降低架构设计复杂度,毕竟服务器一旦带上了状态,扩容、缩容、路由都会受到制约。无状态协议不要求服务器在多个请求期间保留每个用户的信息。
但,你可能会问,如果有登录要求的业务怎么办?HTTP协议提供扩展机制,Header中增加了Cookie,Cookie是一个存储在用户主机中的文本文件,里面含有一串"识别码".用于Web识别用户.存储在客户端,每次请求时自动携带,采用空间换时间机制,满足上下请求关联。虽然浪费了些网络带宽,但是减少了复杂度。当然为了减轻网络负担,浏览器会限制Cookie的大小,不同浏览器的限制标准略有差异,如:Chrome 10,限制最多 180个,每个Cookie大小不能超过 4096 bytes
http 的访问流程是什么?
答案:
- 客户端发起一个http请求,告诉服务器自己支持哪些hash算法。
- 服务端把自己的信息以数字证书的形式返回给客户端(公钥在证书里面,私钥由服务器持有)。
- 客户端收到服务器的响应后会先验证证书的合法性(证书中包含的地址与正在访问的地址是否一致,证书是否过期)
- 如果证书验证通过,就会生成一个随机的对称密钥,用证书的公钥加密。
- 客户端将证书公钥加密后的密钥发送给服务端
- 服务端用私钥解密,解密之后就得到客户端的密钥
- 然后,客户端与服务端就靠密钥完成明文加密、安全通信、对称解密
对称加密与非对称加密有什么区别?
答案:
- 对称加密。加密和解密使用同一个密钥。速度快。常用的如:AES、DES
- 非对称加密。公钥与私钥配对出现,公钥对数据加密,私钥对数据解密。常用的如:RSA、DSS
TCP 抓包用什么工具?
答案:Wireshark,应用最广泛的网络协议分析器。功能非常丰富
- 支持数百个协议
- 实时捕获、离线分析
- 支持 Windows、Linux、macOS、Solaris、FreeBSD、NetBSD等平台;
- 界面化操作
- 支持 Gzip
- 支持 IPSec
洋洋洒洒一万多字了,但是关于计算机网络的学习才是刚刚开始.上面的知识点也许只能应付面试而我们要做的不是应付自己.我们要一直保持内在的热情和踏实的态度,相信你也可以.
,