引言

就现在而言,大都网络编程的系列的文章都在围绕着核算机网络系统进行论说,但其间太多理论概念,关于大部分隔发者而言,用途甚微。因而,在本系列中则会以实践开发者的工作为中心,从Java程序员的视点动身,详细解读Java的网络编程中心内容。

一、核算机网络的“宿世此生”与根底概念

先来看看维基百科关于 核算机网络 这个名词的解释:

核算机网络是指将坐落不同地理位置,但具有独立功用的多台设备,经过通讯设备和线路衔接起来,在网络操作系统,网络办理软件、网络通讯协议的和谐办理下,完结资源同享和信息传递的核算机系统。

简略来说,核算机网络便是用于满意不同机器之间通讯、同享的一种系统。

其实一开端核算机网络是用于军事化意图的,因美国军方需求一种多节点的通讯技能,确保在其一部分节点被摧毁后,也能够确保通讯依旧正常,因而组建了一个部分ARPA并在1966年完结了ARPANET(阿帕网)项目,该项目也是最早的核算机网络之一。
当然,后续随着科技不断进步,各种网络相关的技能百家争鸣,呈现了各式各样的网络技能,但一同也带来了很大的局限性,例如:不同的核算机网络之间并不能彼此通讯、不同操作系统之间无法通讯、覆盖规模及其有限等。因而,ARPA需求一种技能将不同的核算机局域网互联,终究ARPA安排创建了一个新的项目被称为internetwork因特网,也被称为“互联网”。

internetwork项意图研发进程中,1974年,Robert E. Kahn以及Vinton G. Cerf两位教授正式提出了新的传输协议:TCP/IP协议,用于满意不同核算机网络之间的互联通讯,ARPA1982年承受TCP/IP选定为Internet首要的核算机通讯系统,作为因特网通讯的“基石”。

1.1、核算机网络的组成

从组成上而言,核算机网络首要由主机、协议、传输介质以及软件四部分组成。

  • 主机:可所以手机、电脑、服务器、电子手表等任意核算机硬件。
  • 协议:各类界说归法的网络通讯协议,如TCP/IP、IPX/SPX、AppleTalk等。
  • 传输介质:传输数据的通道,可所以实体铜线、电缆、光纤,也可所以无形的电磁波空间介质。
  • 软件:包含一切联网的运用,如QQ、微信、支付宝、淘宝、京东等各类软件。

1.2、核算机网络的功用组成

核算机网络系统首要供给的两个中心功用就在于:

  • 资源同享:资源子网完结。
  • 数据通讯:通讯子网完结。

资源子网以及通讯子网也对应着OSI中的上三层和下三层。

不过假如学习过核算机网络课程的小伙伴应该都知道,其实核算机网络是一个杂乱而巨大的系统,由软件、驱动、硬件、线路等多部分一同组成,但关于这些理论性内容不再论说,有爱好的能够自行了解。

1.3、网络分层与OSI七层模型的由来

核算机网络是个十分杂乱的系统,由于开端各个核算机网络系统结构不同,导致两边网络之间无法互通,因而,20世纪90年代,ISO世界规范化推出了OSI模型打算拟定核算机网络系统规范。

简略来说就类似于国内的普通话,由于不同省份的方言不同,导致不同当地的人交流起来并不方便,因而界说了“普通话”这一规范,一切人都遵循该规范进行交流交流。

但由ISO安排拟定的OSI网络七层模型结构并没有得到广泛运用,实践中运用最广泛的是TCP/IP系统结构。换句话说,OSI七层模型仅仅理论上官方拟定的世界规范,而TCP/IP系统结构才是事实上的世界规范。

PS:世界规范化安排提出的OSI模型未得到广泛运用的原因:
①拟定时过分理想化,未考虑实践的运用场景。
②拆分过于精细化,完结起来过于杂乱,运转功率并不高。
OSI系统的拟定周期过长,导致按其规范生产的设备无法及时投入市场抢占份额。
OSI系统由于分层过多,规划也不合理,有些相同的功用在多个层次重复呈现。

但由于TCP/IP系统中的最后一层没有拟定规范的规范,所以关于学习核算机网络完善系统时会缺失一部分,所以又提出了一种折中计划,也便是综合OSI以及TCP/IP两个系统的优缺点,提出了一种五层结构的原理系统,因而在触摸核算机网络系统时,一般都会存在三种分层结构:

  • 法定规范系统:OSI七层结构。
  • 实践运用系统:TCP/IP四层结构。
  • 原理教育系统:五层结构。

二、OSI七层网络模型与TCP/IP协议簇

核算机网络系统选用的是分层结构,每个层次之间互不搅扰,上层不需求关怀基层的详细完结,基层只需求为上层供给服务即可。

ISO安排界说的世界规范OSI模型中,是七层网络模型。
在实践运用最广泛的TCP/IP模型中,是四层网络模型。
当然,在核算机网络教育中,也提出了五层网络模型。

但不管多少层网络模型,其实本质上都是在叙说相同的内容,只不过拆分的精细度不同而已,三种网络模型对应如下:

(一)Java网络编程之计网基础、TCP-IP协议簇、TCP、UDP协议及腾讯QQ通信原理综述

2.1、OSI七层网络模型

OSI七层网络模型中,每层的功用如下:

  • 运用层:人与核算机网络交互的窗口。
  • 表明层:担任数据格式的封装,如加密、紧缩、编解码等。
  • 会话层:树立、停止、办理不同端间的会话衔接。
  • 传输层:供给端到端(两台机器)之间的传输机制,以及供给流量操控、犯错效验。
  • 网络层:逻辑寻址,IP地址,鄙人两层的根底上向资源子网供给服务。
  • 数据链路层:担任树立和办理节点间的链路,将数据封装成帧,进行牢靠传输。
  • 物理层:在介质媒体上传输比特流。

TCP/IP系统中,将原本OSI系统中的运用层、表明层、会话层兼并为了运用层,将数据链路层和物理层兼并为了数据链路层,因而TCP/IP系统中只存在四层结构。

留意点:在开端由于技能问题,因而数据传输有必要树立在物理实体介质的根底之上,但如今无线电的电磁波技能也能够做到运用空气作为介质,然后抵达传输数据的意图。

OSI分层系统中,上三层:运用层、表明层、会话层组成资源子网,下三层:网络层、数据链路层、物理层组成通讯子网。

2.1.1、OSI模型的通讯的封装与解析进程

在网络通讯中,通讯两边都有必要是对等的,并且两边都恪守相同协议的,这样才可通讯。比方举个例子:

竹子想发微信信息给熊猫,喊熊猫出来玩,但两边之间的通讯根底有必要对等,也便是说,熊猫的手机上也有必要要装置了微信,否则竹子无法经过微信与熊猫出来玩。
但假如竹子说的是英语,熊猫只能懂汉语,两边并未恪守相同的“协议”,那两者之间天然也无法进行通讯。因而,通讯的另一要素则是:通讯两边都有必要恪守相同的协议。

而在核算机网络中,当两台机器进行通讯时,其进程首要包含数据的封装与解封:

(一)Java网络编程之计网基础、TCP-IP协议簇、TCP、UDP协议及腾讯QQ通信原理综述

如上图,左边是发送端,右侧是接纳端,当发送端的运用尝试传输一条数据时,数据会依据网络分层结构,从上至下顺次封装,每层都对数据做必定的处理,最后在物理层转换为比特流(二进制数据),然后传输至接纳端。
由于两边之间恪守的都是相同的协议系统(网络模型),因而接纳端会首要接纳到比特流数据,然后从下至上顺次解封数据,终究在运用层复原数据,然后抵达通讯的意图。

2.2、TCP/IP协议簇

TCP/IP应该是核算机网络中听的次数最多的词汇,但它并非单纯的指TCPIP两个协议,而是一组协议的代名词,指由许许多多的网络协议一同组成的“协议簇”,TCP/IP协议簇首要组成如下:

(一)Java网络编程之计网基础、TCP-IP协议簇、TCP、UDP协议及腾讯QQ通信原理综述

上面列出了一些TCP/IP协议簇中常用的一些协议,但整个协议簇是由大巨细小上百个协议一同组成的(关于TCP/IP协议簇中的一些常用协议可参考:百度百科)。
在核算机网络系统中,每层都会存在多个协议,但一个协议只会隶归于一层。一同,协议也能够由软件、硬件两个维度来完结。

除开最常见的TCP/IP协议簇外,还有一些其他的协议组,如IPX/SPX、NetBEUI、AppleTalk等协议组。

2.2.1、通讯协议的基本概念

前面的叙说中,更倾向于“空中楼阁”般的理论概念,比较生涩难懂,接下来咱们以实践的TCP/IP协议动身,再对核算机网络更进一步论说。

TCP/IP通讯协议是最完好、运用最广泛的网络协议系统,它的魅力在于可使不同硬件结构,不同操作系统的核算机彼此通讯,通讯协议中界说多方之间发送/接纳的报文格式、次序以及规矩,其间语法界说了传输的报文格式,语义界说了报文传输规矩,时序界说了报文传输次序,核算机通讯的本质就在于信息报文的彼此交换

2.2.2、协议数据单元(PDU)

核算机网络系统中,不同节点通讯时交换的信息报文被称为协议数据单元(PDU)PDU首要由协议头信息+数据(SDU)组成,数据是指发送端需求传输给接纳端的信息,而协议头信息中,则包含了完结传输所需的操控信息,如地址、长度、序号、分段标识、过失操控信息等。

依据TCP/IP系统而言,PDU在不同层存在不同的称呼,如下图:

(一)Java网络编程之计网基础、TCP-IP协议簇、TCP、UDP协议及腾讯QQ通信原理综述

2.3、核算机网络系统中各层总述

就现在而言,前面的论说中现已将核算机网络中最常见的OSI、TCP/IP系统简略介绍了解了,但关于这些系统中,不同层的详细效果却并没有进行讨论。因而,接下来咱们从自己规划一个核算机网络系统的视点动身,分别来讨论网络分层的必要性与每个分层的详细意义。

2.3.1、物理层

先来看最简略的通讯模型:

(一)Java网络编程之计网基础、TCP-IP协议簇、TCP、UDP协议及腾讯QQ通信原理综述

如上图,两台电脑之间通物理媒体衔接,互相传递信息,然后抵达通讯的意图。

在这种最简略的直连通讯模型中,想要完结两边之间的通讯,那应该考虑如下几个问题:

  • ①衔接两台电脑之间的传输媒体能够选用哪些介质类型。
  • ②衔接两台电脑时,两台电脑应该存在怎样的物理接口。
  • ③传输数据时,运用何种信号表达比特流中的01
  • ④两边之间通讯时,不同的传输介质,数据传输的速度规范又该是多少。

关于如上问题,咱们能够将其悉数归纳到“物理层”来处理,在该层中界说规范规范。

简略来说,物理层首要使命是担任在介质上正确的传送比特流,并规则物理接口的各种特性和物理设备的规范,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。

2.3.2、数据链路层

但一般现在不会存在直连型网络,常用的核算机网络都是由多台机器一同组成的,如下:

(一)Java网络编程之计网基础、TCP-IP协议簇、TCP、UDP协议及腾讯QQ通信原理综述

在这种总线衔接的通讯模型中,当一台主机,比方AD发送数据时,数据会经过总线传输至总线上的一切主机,此刻D怎么知道该条数据是发给自己的呢?其他主机又怎么差异数据不是发给自己的呢?因而,关于这种多台机器组成的网络模型而言,咱们也需求处理一系列问题,如:

  • ①编址问题:怎么差异总线上的各主机(如MAC地址),在发送数据时,带上方针主机的地址,其他主机依据数据中的方针地址承认是否是发给自己的。
  • ②当其他主机收到传递的数据后,怎么从比特流中正确差异出数据和意图地址。
  • ③当一同多台主机共用主线时,怎么和谐各主机竞争总线,防止数据发生磕碰。

关于上述中的这些问题,能够悉数划归到链路层处理。

因而能够得出,数据链路层首要使命是完结数据在不牢靠的物理线路上的牢靠传递,担任供给物理地址寻址、数据的成帧、流量操控、过失操控等功用,确保数据的牢靠传输

PS:关于这种总线型网络早已淘汰,现在常用的则是以太网的交换式通讯模型:

(一)Java网络编程之计网基础、TCP-IP协议簇、TCP、UDP协议及腾讯QQ通信原理综述

2.3.3、网络层

到现在为止,处理了物理层及链路层中的问题后,就能够完结数据在一个局域网络中的传输了。但实践每天都触摸的因特网是由无数个小网络和路由器互连组成的,如下:

(一)Java网络编程之计网基础、TCP-IP协议簇、TCP、UDP协议及腾讯QQ通信原理综述

因而只处理前面所叙说的问题仍是无法在巨大的核算机网络中完结通讯,终究之前由于只要一个网络,所以不需求对网络进行标识。但在这种广域网模型中,会存在大巨细小无数个局域网,所以想要从一台主机将数据传输给另一台主机时,此刻又该怎么精准定位到某个网络中的详细主机呢?因而又产生了一系列的问题需求加以处理:

  • ①怎么标识各个网络及网络中的主机(网络和主机一同编址问题,如IP地址)。
  • ②一台主机向另一台主机发送数据时,在广域网中往往存在多条链路可走,此刻怎么挑选最适宜的路由。

而关于这些问题咱们都能够划归到网络层处理。

所以,网络层首要担任将网络地址翻译成对应的物理地址,并经过路由挑选算法为数据的传输挑选最恰当的途径

路由挑选:路由首要包含路由表和路由算法两个方面,网络层会依据速度、距离(步跳数)、价格及网络拥塞程度等因素,在路由表的多条通讯途径中找一条最佳途径。

2.3.4、传输层

至此,假如处理了物理层、链路层及网络层的问题,数据就能够做到在不同的网络中进行通讯。但这关于普通用户而言仍然不行,由于一台主机上会装置多个运用程序,比方:

主机A上装置了QQ、微信、谷歌浏览器,当另一台主机向主机A发送数据时,那这些数据到底应该交给主机上的哪个进程处理呢?

因而还需求处理:

  • ①怎么处理进程之间依据网络的通讯问题,怎么标识网络通讯相关的进程。
  • ②假如数据在传输进程中呈现丢包、误码等传输过错,又该怎么处理。

这些问题能够被划归到传输层加以处理。

依据OSI模型而言,上三层资源子网首要担任用户数据处理,下三层通讯子网首要担任数据通讯,而传输层坐落OSI模型中的第四层,是资源子网与通讯子网之间的桥梁,因而,不管是在OSI亦或TCP/IP系统中,传输层都是至关重要的一层。

传输层的首要功用是:供给端到端之间的传输机制以及供给过失效验和流量操控,确保报文的正确传输。TCP/IP系统中,首要供给了两种传输服务:

  • “面向衔接”的TCP牢靠传输协议。
  • “面向无衔接”的UDP不牢靠传输协议。

2.3.5、运用层

运用层不管是在OSI亦或TCP/IP模型中,都是坐落最高层,它是用户、各种运用程序和网络之间的接口,其功用是直接向用户供给服务,并完结用户在网络中的各种操作,运用层为用户供给的服务规模包含:文件目录服务、文件传输服务、远程登录服务、电子邮箱服务、打印服务、网络办理服务、安全服务、域名办理服务等,这些服务由运用层中各种协议及运用程序供给。

TCP/IP系统中将资源子网都兼并为了运用层,但在OSI模型中,资源子网是分为运用层、表明层、会话层三个层次的,也便是拆分粒度更精细化,服务也更为精细化。

2.3.5.1、OSI-表明层

首要担任运用层的用户数据处理,例如数据编/解码、数据的加密解密、数据紧缩、数据格式处理等,其效果如其名,首要处理用户信息的表明问题。

2.3.5.2、OSI-会话层

会话层坐落OSI模型的第五层,是用户运用程序和网络之间的接点,首要担任网络中的两节点间树立、办理和停止通讯。会话层的功用包含:树立通讯链接、坚持会话进程、保持通讯链接的畅通、同步节点间的对话信息、决议通讯是否停止以及通讯中止时决议从何处从头发送。

简略而言,运用层首要是为用户与网络之间,供给各类可“触摸”的窗口。

2.3.6、TCP/IP系统中数据的通讯进程

与之前的OSI模型的通讯进程相同,TCP/IP系统中,一端想往另一端传输数据时,数据也会阅历封装与解封的进程,数据经过每一层时都会参加当时层的协议信息,然后形本钱层的PDU,继而向下传递,直到终究被转换为比特流数据,经过传输介质转换为信号传输到另一端,另一端接纳到之后则会顺次解封数据,进程如下:

(一)Java网络编程之计网基础、TCP-IP协议簇、TCP、UDP协议及腾讯QQ通信原理综述

同比日子,也便是类似收发快递的进程:

  • 发件:[发件人]→[货品]→[驿站]→[快递公司站点]
  • 传输介质:[运输道路]→[中转站]
  • 收件:[快递公司站点]→[驿站]→[货品]→[收件人]

2.3.7、核算机网络根底总结

到现在为止,核算机网络中一些比较重要的根底概念已介绍结束,前面的论说中,从核算机网络的诞生,到法定的OSI规范系统以及TCP/IP系统进行了简略剖析,关于开发者而言,这些根底知识了解即可,想要深化学习的小伙伴可观看《湖科大的核算机网络视频教育》,讲的比较透彻切浅显易懂。

三、IP网络协议与TCP、UDP网络传输层协议

前面更多的在叙说核算机网络的整体的结构,接下来则预备对核算机网络中几个常见的网络协议进行论说,如IP、TCP、UDP等协议(HTTP、HTTPS放鄙人章讲解)。

3.1、IP协议

当运用层的数据被封装后,想要将数据在网络上传输,数据终究要被发往何处,又该怎么精准的在网络上定位方针机器,此刻起到要害效果的便是“IP协议”。
IP协议的效果在于把各种数据包准确无误的传递给方针方,其间两个重要的条件是IP地址和MAC地址。其间IP地址便是一切主机在网络通讯中的唯一标识,但由于IP地址是稀有资源,不或许每个主机都拥有一个IP地址,因而路由器里边会记载咱们主机的MAC地址,一般的IP地址是路由器依据MAC地址生成的,而MAC地址是全球唯一的。

举例:IP地址就好像是物流线路上的驿站地址,而MAC地址便是详细货架上货品的位置。

之前的IP地址选用的IPv4格式,现在大部分主机都已向IPv6过渡。

3.1.1、IP地址的组成与分类

IP地址一般由网络标识(NetID)主机标识(HostID) 两部分组成,其间网络标识对应着网络地址,表明其局域网归于互联网中的哪一个网络;主机标识对应着一台机器的主机地址,表明机器归于该局域网络中的哪一台主机。
一般状况下,一个IP存在四组数字,每组数字对应着八位二进制数字(一个IP地址合计32Bit),每组之间分别用.离隔,其间不同类型的IP地址,表明网络标识和主机标识的数字段也不同,现在的IP地址首要可分为A、B、C、D、E五大类,如下:

(一)Java网络编程之计网基础、TCP-IP协议簇、TCP、UDP协议及腾讯QQ通信原理综述

A类IP

A类地址由8位网络标识+24位主机标识组成,也便是之前的四组数字中,榜首组表明网络地址,而后三组代表主机地址。网络地址的最高位,即首位有必要为0,其间0127都为保存位,因而AIP的网络地址规模为1~126(1.0.0.0~126.0.0.0),也就代表着可用的A类网络有126个,每个网络中最大可包容一千多万台主机(224-2)。

PS:为什么A类网络的地址规模是1~126呢?
由于AIP顶用8bit表明网络标识,首位需求保存为0,因而剩下的7bit能够表明的最大数字为127,末位127也需保存,因而A类网络地址的取值规模为1~126

暗示图如下:

(一)Java网络编程之计网基础、TCP-IP协议簇、TCP、UDP协议及腾讯QQ通信原理综述

例如32.44.128.5这个地址,其间榜首段代表网络地址,剩下三段表明网络中的主机地址。

B类IP

B类地址由16位网络标识+16位主机标识组成,因而IP中榜首段和第二段都为网络标识,其间前两位为保存位1、0,因而BIP的网络地址取值规模为128~191(128.0.0.0~191.255.0.0),总计可用的B类网络数量为16382个,每个网络中可包容6万多台主机(216-2)。BIP组成暗示图如下:

(一)Java网络编程之计网基础、TCP-IP协议簇、TCP、UDP协议及腾讯QQ通信原理综述

例如128.123.11.32这个地址,其间前两段为网络地址,后两段表明网络中的主机地址。

C类IP

C类地址由24位网络标识+8位主机标识组成,也便是说,整个IP地址中,前三段都为网络地址,最后一段为主机地址。C类地址中,前三位都为保存位,即C类网络的最高位有必要为1、1、0,因而C类网络地址的取值规模为192-223(192.0.0.0~223.255.255.0),大略核算下来,C类网络的数量可达209万左右,每个网络中答应存在254台主机(28-2),组成暗示如下:

(一)Java网络编程之计网基础、TCP-IP协议簇、TCP、UDP协议及腾讯QQ通信原理综述

192.0.0.121这个IP,前三段为网络地址,最后一段则为网络中的主机地址。

D类IP

D类和后续的E类归于特别的IP地址,D类地址被称为播送或组播地址,其最高位有必要是1、1、1、0,因而取值规模为224~239(224.0.0.0~239.255.255.255),如下:

(一)Java网络编程之计网基础、TCP-IP协议簇、TCP、UDP协议及腾讯QQ通信原理综述

E类IP

E类地址则归于保存的地址,为以后接入更多的网络预留的IP,其最高位有必要为1、1、1、1,即EIP榜首段的取值规模为240~255(240.0.0.255~239.255.255.254)

(一)Java网络编程之计网基础、TCP-IP协议簇、TCP、UDP协议及腾讯QQ通信原理综述

255.255.255.255这个全1IP归于特别意义的地址,表明当时子网的播送地址,好像全0IP0.0.0.0代表本机地址相同,带有特别的意义。

IP分类小结

因不同类型的网络IP规模不同,所以它们也分别运用于不同的场景,如:

  • AIP适用于大型网络,由于单个网络中可包容的主机数十分巨大,因而常被保存给政府机构运用。
  • BIP适用于中型网络,一般会被分配给公益安排、中大型企业等。
  • CIP适用于小型网络,这种IP适用于一切需求网络的个体和小集体,如网吧、家庭、个人电脑等。
  • DIP用于组播。
  • EIP用于保存和试验。

3.1.2、子网掩码

子网掩码又被称为网络掩码、地址掩码、子网络遮罩,它的效果首要有两个:

  • 一、差异IP中网络地址和主机地址。
  • 二、划分子网,扩展网段内的可用IP数目。

但默许的子网掩码值也并非都相同,不同的网络类型存在不同的默许掩码,如:

  • A类网络的默许子网掩码:255.0.0.0
  • B类网络的默许子网掩码:255.255.0.0
  • C类网络的默许子网掩码:255.255.255.0

一个子网掩码决议着一个子网(独立的单个网络)内可包容的主机数量,核算公式为:可包容的主机数量=(2n次方)-2。这个n能够了解为二进制掩码中0的数量,例如:

  • A类默许掩码:255.0.0.0转换为二进制为:11111111.00000000.00000000.00000000,后边有240,因而可包容的主机数量为(224次方)-2,即16777214台主机。
  • C类默许掩码:255.255.255.0转换为二进制为:11111111.11111111.11111111.00000000,后边存在80,因而C类网可包容主机数量为(28次方)-2,即254台主机。
修正子网掩码为局域网扩容

在中型企业中,经常会碰到一个问题,公司运用C类网,因而子网内可包容的主机(电脑)数量为254台,但实践公司的电脑或许超出这个数量,如存在440台电脑,那此刻怎么更改路由器的设置能够让440台电脑一同上网呢?

  • 计划一:增加路由器的数量,更改多个路由器装备。
  • 计划二:经过改变子网掩码的方法为局域网扩容。

,关于榜首种计划需求增加经济本钱,因而能够暂不考虑。来看看第二种计划,此刻将子网掩码修正到多少适宜呢?核算进程如下:

  • ①:主机数量/子网可包容主机的最大数,再向上取整,即:
    • 440/254≈1.73,向上取整成果=2,也便是包容440台电脑需求2个网段。
  • ②子网掩码决议着子网内可包容的主机总量,那么设:2N次方≈主机数量,求N
    • 2N次方=440,可算出N>8,即N=9最适宜,因而掩码低位应当存在90
    • 即:11111111.11111111.11111110.00000000,转换为十进制:255.255.254.0
    • 因而终究核算出子网掩码为255.255.254.0最适宜。

此刻假设路由器的LAN口装备是197.118.0.1,那依据榜首步核算出的网段数量,分配两个子网段,197.118.0.1~197.118.1.254即可满意需求,选用这种更改子网掩码的方法,就在不增加路由器的状况下,也能达成了为局域网增加可用IP数的需求。

终究可用IP规模为:197.118.0.1/23,可用IP地址合计510个。
嗯?xxx/23是什么东东?其实这个值是子网掩码的简写方法,之前算出来的子网掩码为255.255.254.0,转换为二进制,总共存在231,因而能够简写为xxx/23

怎么判别两个IP处于同一个网段

两个IP处于同一网段的前提是:两个IP的网络标识有必要共同,那怎么核算网络地址呢?

网络地址 = IP地址 “位与” 子网掩码。

如C类网197.118.0.198、197.118.1.114两个IP,子网掩码为255.255.254.0,怎么核算网络地址?首要需求将掩码与IP悉数都转换为二进制,如下:

  • 197.118.0.19811000101.01110110.00000000.11000110
  • 197.118.1.11411000101.01110110.00000001.01110010
  • 255.255.254.011111111.11111111.11111110.00000000

首要将197.118.0.198网络部分(前三段)的二进制值同掩码进行位与运算,终究能够核算出:

11000101.01110110.00000000,转换为十进制为197.118.0

紧接着再197.118.1.114网络部分的二进制值同子网掩码进行位与运算,核算成果:

11000101.01110110.00000000,转换为十进制为197.118.0

终究可得到成果:197.118.0.198、197.118.1.114的网络地址都为197.118.0,代表着这两个IP处于同一个网段。

子网掩码小结

子网掩码这块的内容,假如你不是专门做网络相关的工程师,哪恰当了解即可,如不了解其内容也无关紧要,作为软件开发者并不需求过分深化研讨。

3.1.3、IP协议中心流程

经过上述内容学习后,咱们现已对IP协议中的IP组成、分类、核算等知识现已树立起了根底,接下来在重点看看IP协议的中心流程。IP协议中心首要包含IP寻址和路由操控。

前面曾提及:网络上任何一台主机都会存在自己的IP地址,那么当运用层数据被封装后,能够精准定位到方针主机的要害原因就在于IP,能够经过IP地址在网络中进行寻址,然后让数据抵达意图主机。

但在实践的网络通讯进程中,或许有时数据发送的链路十分遥远,如你从中国向日本网友发送一条数据,那么由于一些网络颤动、物理介质损坏都会导致数据丢掉。但此刻又该怎么确保数据“安稳”抵达意图地呢?

为了防止数据由于介质损坏或网络颤动等原因丢掉,因而会在数据的传输链路中参加一些“中转站”,也便是所谓的“路由器”,一方面能够备份数据,检查数据是否丢掉,假如丢掉会从头发送,另一方面也能够操控数据的转发。当然,这个操控数据转发的进程也被称为“路由操控”。

正由于路由操控的存在,所以即便网络杂乱多变,也能够经过路由器的操控将数据“安稳”送达至意图主机。

但因数据传输进程中,数据从发送方到接纳方之间存在的链路是不可预估的,因而数据传输的链路上或许会分布许多路由器。本质上数据在链路中传输,便是一个个路由器彼此之间交换数据报的进程,当然,这个进程也被称为“”。

跳:数据包经过一台路由器便是一跳。
比方一个网络中存在四个路由器:A、B、C、D,假如局域网A中的主机要给局域网D中的主机发送数据,从理论上来说就会经过B、C、D三台路由器,也便是会经过三跳。

哪当数据抵达某个路由器后,它怎么知道“下一跳”该去往何处呢?此刻中转的路由器就会解析收到的数据报,然后从中解析出IP数据报,然后查询自身的路由表,然后挑选“下一跳”该走的道路,终究不断重复该进程直至数据抵达方针主机。这种多次转发数据的进程也被称为“多跳路由”。

3.1.4、IPv4与IPv6

现在的网络简直大部分仍是依据IPv4版别,但一同大部分运用程序也开端支撑IPv6IPv6是“Internet Protocol Version 6(互联网协议第6版)”的缩写,是用于替代IPv4的下一代IP协议,也便是下一代互联网的协议。

IPv6相较于IPv4而言,首要不同点在于:

  • ①地址空间不同,IPv4地址选用32位长度,IPv6的地址则选用128位长度。
  • IPv6的路由表会比IPv4更小、更精细。
  • IPv6的组播支撑以及对流的支撑要强于IPv4
  • IPv6的安全性更高,运用IPv6的用户可对网络层数据进行加密。
  • 协议扩大不同,IPv6答应协议进行扩大,而IPv4不答应。

前述的IP协议剖析都是依据IPv4版别而言的,由于现在干流的网络版别仍是IPv4,但如今也逐步向IPv6过渡。

3.2、“面向衔接”的TCP牢靠传输协议

TCP(Transmission Control Protocol)传输操控协议是面向衔接的牢靠传输协议,是坐落传输层的中心协议之一,在不牢靠的互联网络上,IP协议只供给了简略不牢靠的包交换,但网络中不同主机之间经常需求一种牢靠的、类似于管道相同的衔接、流机制,去稳定传输一些数据,如视频、音频、图片等大文件数据。
因而TCP应运而生,TCP协议是为了在不牢靠的互联网络上供给牢靠的端到端之间,字节省传输而专门规划的一个传输协议,TCP中选用字节省传输数据。

3.2.1、TCP协议简介

先来看看TCP的报文头结构:

(一)Java网络编程之计网基础、TCP-IP协议簇、TCP、UDP协议及腾讯QQ通信原理综述

TCP报文头结构中的各字段释义如下:

  • ①源端口/意图端口:指数据发送方的运用进程端口号及接纳方的进程端口号。
  • ②序号:TCP为了确保数据的牢靠传输,会对分段数据标注序号,勇于拼装和承认数据的正确性。
  • ③承认序号:当接纳方收到接纳到本次数据时,下次需求发送的数据段序号。
  • ④首部:表明TCP报文头的长度,由于TCP头长度可变性,因而需求在头信息中声明每个头的长度。
  • ⑤保存位:预留一些空间给未来拓展时运用。
  • URG:表明本次发送的报文数据中是否紧迫数据。
  • ACK:承认信号,当报文中ACK=1的时分表明正确或赞同。
  • PSH:表明接纳方应该尽快将这个报文交给运用层,为后续数据腾出空间,不要停留在缓冲区。
  • RST:假如收到RST=1的报文,说明与主机的衔接呈现严重过错(如主机崩溃),有必要开释衔接,然后从头树立衔接。
  • SYN:树立一个新衔接,SYN=1表明这是一个恳求树立衔接的报文段。
  • FIN:断开一个衔接,FIN=1表明告知告知对方本段要封闭衔接了。
  • ⑫窗口巨细:表明现在答应发送的数据量,当抵达此值,需求ACK承认后才能继续发送数据。
  • ⑬效验和: 经过CRC算法供给额定的牢靠性,用于效验数据正确性。
  • ⑭紧迫指针:标记紧迫数据在数据字节省中的位置。
  • ⑮选项:这块归于动态的可挑选参数。首要选项如下:
    • 最大报文段长度、窗口扩展、时刻戳。
  • 数据:报文段传输的数据内容(不归于TCP报文头的范畴内)。

当运用层向传输层传递数据时,TCP会首要对数据流进行分段,将大的数据拆分成一个个的数据报文段,然后会将封装好的数据包传递给网络层的IP层。一同,为了防止数据在网络传输中丢包,TCP也会对每个数据包分配一个序号,当接纳方成功收到发送的数据后,会回来一个ACK承认,假如发送方在规则的合理时刻(RTT)内未收到接纳方的ACK,那么对应的数据包会被认定为已丢掉,发送方会将该段数据从头传输。

当数据接纳完结后,TCP会用校验和函数来查验数据是否正确,在发送方和接纳方都需求核算该值,发送方核算后会将该值放在TCP头中携带发送,接纳方接纳到数据后,也会再次核算该值,再与报文头中的值进行比对,承认数据的正确性。

3.2.2、衔接办理机制 – 三次握手与四次挥手

由于TCP是依据管道衔接式通讯的协议,因而在数据传递之前,有必要要先树立衔接,当数据传输结束后,也有必要要封闭衔接。因而,这就引出了面试进程中人尽皆知的问题:“为什么TCP是三次握手,四次挥手!

想要了解清楚这个问题的答案,那么得先了解TCP树立与封闭衔接的进程。

TCP的三次握手

所谓的TCP三次握手,其实是指TCP树立衔接的进程,由于TCP归于牢靠性的传输协议,因而在发送数据前有必要要先确保发送/接纳数据的两边状况正常,因而需求经过“三次握手”的进程,详细如下:

(一)Java网络编程之计网基础、TCP-IP协议簇、TCP、UDP协议及腾讯QQ通信原理综述

  • ①客户端向服务端发送树立衔接的数据包SYN=1,seq=x,然后进入syn-send等候承认衔接状况。
    • SYN=1:代表恳求树立衔接。
    • seq=x:当时数据包的序号。
  • ②服务端接纳到恳求树立衔接的数据包后,答应树立衔接的状况下,会回来呼应报文SYN=1,ACK=1,seq=y,ack=x+1给客户端。
    • SYN=1TCP是双全工协议,因而服务端也需向客户端发送SYN=1信号。
    • ACK=1:承认客户端树立衔接的恳求。
    • seq=y:表明当时服务端回来给客户端的序号。
    • ack=x+1:承认客户端序号x之前的恳求都已收到。
  • ③由于是双全工协议,衔接是双向的,因而客户端也需承认一下服务端的衔接恳求,收到服务端的SYN=1后,也需回来ACK=1,seq=x+1,ack=y+1的数据包。
    • ACK=1:表明承认服务端的衔接树立恳求。
    • seq=x+1:当时数据包的恳求序号。
    • ack=y+1:承认服务端序号y之前的数据都已成功接纳。

经过如上三个步骤,客户端和服务端两边之间承认恳求后,衔接会成功树立,紧接着两边都会处于estab-lishen状况,数据能够正常传输。

当然,这个进程稍微有些难了解,换个日常日子的例子来快速了解一遍!

  • ①特种兵-竹子:我是竹子,熊猫收到请答复!收到请答复!
  • ②指挥部-熊猫:熊猫收到,我是熊猫,竹子能收到吗?收到请答复!
  • ③特种兵-竹子:竹子收到!竹子收到!
  • 通话开端………
TCP的四次挥手

当“三次握手”完结后,客户端和服务端之间会成功树立衔接,从此开启两边端到端之间的数据传输,当一方数据传输完结后,会尝试中止衔接,因而又会阅历“四次挥手”的进程,如下:

(一)Java网络编程之计网基础、TCP-IP协议簇、TCP、UDP协议及腾讯QQ通信原理综述

  • ①客户端完结数据传输后,会宣布FIN=1,seq=u封闭衔接的报文,然后等候服务端呼应。
    • FIN=1:代表恳求封闭衔接。
    • seq=u:恳求序号。
  • ②服务端收到客户端的“封闭”恳求后,会给客户端回来承认封闭的报文:ACK=1,seq=v,ack=u+1
    • ACK=1:承认客户端“封闭衔接”的恳求。
    • seq=v:恳求序号。
    • ack=u+1:承认客户端序号u及其以前的数据都已成功接纳。
    • 客户端传输完结数据后,会告知服务端自己要封闭衔接了;
    • 但服务端或许数据还未传输完结,因而会继续传输自己的数据,直至自身的数据也传输完结后,也会告知客户端:自己也要封闭衔接了。
  • ③服务端传输完结自己的数据后,向客户端发送封闭衔接的报文:FIN=1,ACK=1,seq=w,ack=u+1
    • FIN=1:表明自己也要“封闭衔接”了。
    • ACK=1:承认收到了之前的数据。
    • seq=w:恳求序号。
    • ack=u+1:承认客户端序号u之前的数据都已成功接纳。
  • ④客户端接纳到服务端“封闭衔接”的恳求后,给服务端呼应承认报文:ACK=1,seq=u+1,ack=w+1
    • ACK=1:承认服务端“封闭衔接”的恳求。
    • seq=u+1:恳求序号。
    • ack=w+1:承认服务端序号w之前的数据都已成功接纳。

前面提及过,由于TCP是双全工的协议,因而两边都能够自动开释衔接,在TCP中,当一方数据传输完结后,就会自动封闭衔接,也就会阅历“挥手”的进程,同样咱们也能够举个浅显一些的例子来认识这个进程:

  • ①特种兵-竹子:竹子报告结束,请指示!
  • ②指挥部-熊猫:指挥部收到!..&*/?..!^...继续说完自己要交代的使命。
  • ③指挥部-熊猫:这里是熊猫,使命已指示结束!
  • ④特种兵-竹子:竹子收到!
  • 中止通话………

三次握手是指TCP树立衔接需求发送三个数据包,首要意图是在于:为了承认两边的接纳才能和发送才能是否正常、指定自己的初始化序列号为后边的牢靠性传送做预备。

四次挥手是指TCP封闭衔接时需求发送四个数据包,首要意图在于:当客户端发送完数据后,给服务端发送“我要封闭衔接了”的恳求,然后服务端告知客户端收到了“封闭恳求”,但此刻服务端会继续向客户端传输未发送的数据,客户端也照常能够接纳服务端的数据,直到服务端的数据传输完结后,服务端也会宣布“封闭衔接”的恳求,客户端赞同后,终究才会断开衔接,然后确保数据正常牢靠的交互。

本质上“三次握手与四次挥手”便是在指TCP树立与封闭衔接的进程,搞了解树立和封闭衔接的进程后再来看看最开端的问题:“为什么TCP是三次握手,四次挥手!

为什么TCP是三次握手,四次挥手

由于树立衔接“握手”时,当服务端接纳到“客户端想与服务端树立衔接”的恳求后,能够立马回来“赞同+与客户端树立衔接”报文,客户端也承认树立衔接后,就能够称为“握手完结”。
但封闭衔接时的“挥手”,由于一方数据传输完结后就会提出封闭衔接,不过另外一方或许还依旧存在数据未发送完结,因而服务端就不能在“承认封闭”衔接的时分,也一同宣布“封闭衔接”的恳求,由于自己的数据还没发送完结呢,所以会等到自身的数据悉数传输后,再自意向客户端建议一次“封闭衔接”的恳求,等候客户端“承认封闭”后,然后完结整个“挥手”动作。

3.2.3、TCP中的沾包问题

要了解“TCP沾包”问题之前,首要要了解TCP传输数据的方法。TCP在传输数据时,会给每个切开后的报文段分配一个序号,接纳方在收到数据后,会按照序号排好,然后将其放置在TCP缓冲区中。一同TCP为了进步传输速度,若接连几次发送的数据都很少,TCP会依据优化算法把多个数据兼并成一个包宣布。

沾包问题:多个数据包在一块儿,无法确认每个数据包之间的切开鸿沟,因而从运用层的视点看来,就好像多个数据包“沾”在了一同。

关于TCP传输层而言,发送方和接纳方都有或许造成数据沾包问题。

发送发导致的数据沾包问题:TCP为了优化传输速度,往往会等收集到足够多的数据后才发送一包数据,因而发送发传输的数据就呈现了沾包问题。
还有一种状况则是:当需求发送的数据大于MSS规则,那么TCP就会对数据包进行拆包,一个数据包会被分隔传输,终究导致数据呈现沾包问题。

接纳方导致的数据沾包问题:TCP中,假如数据被接纳后,运用程序没有及时读取缓冲区中的数据报文,就会导致缓冲区中堆积许多的报文数据。这种状况下,站在TCP层的视点而言,看到的是一个个的数据报文顺次排列着,但关于运用层的程序来说,看到的便是一串接连的字节省数据,运用程序无法知道每个数据包之间的切开鸿沟,站在运用层的视点来看,一切的数据包就好像都“沾”在一同了相同,运用程序依据预先设定好的巨细从缓冲区中接纳数据,终究会一次性读取到多包数据。

沾包问题处理计划
  • ①当运用TCP短衔接时,不必考虑沾包问题。
  • ②当发送无结构数据,如文件传输时,也不需求考虑沾包问题,由于这类数据只管发送和接纳保存即可。
  • ③假如运用长衔接,那么则需求考虑沾包问题:
    • 假如发送的报文都是相同的结构,那么能够在首部中增加数据长度,接纳方依据首部中记载的数据巨细读取数据。
    • 将每个数据包封装成固定长度,不行的用0补齐,接纳方每次按照固定巨细读取数据即可。
    • 在数据之间设置鸿沟,比方增加特别符号,这样接纳方收到数据时,依据特别符号切开数据即可。

3.2.4、TCP协议中的其他中心概念

由于TCP既要确保牢靠性,一同又要尽或许进步传输功用,所以整个TCP规划的尤为杂乱,牵扯出的概念也许多,比方为了确保数据的牢靠传输,TCP中供给的机制:

  • 效验和:数据接纳完结后进行效验。
  • 序列号:数据按次序传输和接纳。
  • 承认应对:收到数据之后回来ACK应对。
  • 超时重试:超出规则时刻后,发送方未收到ACK应对,则会从头再次发送数据。
  • 衔接办理:树立和办理衔接时,都会阅历三次握手、四次挥手确保数据牢靠传递。
  • 流量操控:TCP依据接纳端的处理才能, 来决议发送端的发送速度,防止丢包。
  • 拥塞机制:TCP选用慢发动机制,由于网络拥塞状况不确认,刚树立衔接时会先发送少量数据的包,“摸清楚”网络拥塞程度后,再优化成适宜的数据包巨细传输。

在确保了数据牢靠传输的一同,TCP也供给了一堆机制尽或许进步数据传输功用:

  • 滑动窗口:由于接纳一条数据,回来一个ACK这种应对机制大大影响了传输功率,因而TCP中引入了一个新概念:窗口,窗口巨细是指无需等候ACK就可继续发送数据的最大值,当收到榜首个ACK承认应对后,窗口向后移动,发送后续的数据,由于这个窗口不断向后滑动,所以叫做滑动窗口。
  • 快速重传:结合上述的滑动窗口机制,当某个数据呈现丢包时,接纳方会继续向发送方传输相同的ACK应对序号,当发送方接连三次接纳到相同的应对序号时,就会对该序号的数据报进行重发。
  • 推迟应对:接纳方应对速度越快,那么窗口会越小,而推迟应对便是指:接纳端稍等一会儿后再发送应对信号,应对速度越慢,窗口越大,网络吞吐量就越大,传输功率就越高(但受到数量和时刻的约束)。
  • 捎带应对:在一般数据的传输进程中,大大都状况下都是一发一收的进程,因而ACK应对能够“搭数据的顺风车”,和接纳方回应的数据报文一同回来,如三次握手中的第2次握手,选用的便是捎带应对机制,ACK应对信号和树立衔接的数据报一同发送给了客户端。

一同,TCP协议中,每树立一条衔接都会保持九个定时器,能够恰当了解:

  • 超时重传定时器:超出规则时刻规模后,未收到应对信息,对数据进行重发。
  • 保活定时器:假如已树立的衔接超出规则时刻后还没有数据交互,则保活定时器超时,向对端发送保活勘探包,依据客户端的反馈决议是否继续保持衔接,如客户端正常则重置定时器时刻,如客户端异常则封闭TCP衔接。
  • 继续定时器:也被称为零窗口勘探定时器,当接纳方缓冲区数据满了之后,会在应对报文中告知发送方将窗口置0,阻挠发送方继续发送数据。当缓冲区数据被读取后,会再向发送方宣布一个ACK,告知发送方能够继续传输数据,但为了防止该ACK丢掉导致死锁现象呈现,发送方也会发动零窗口勘探定时器,每隔一段时刻,发送方会自动发送勘探包,迫使接纳端呼应,然后得知其接纳窗口有无打开。
  • ACK推迟定时器:延时应对的定时器,和超市重传定时器功用类似。
  • SYNACK定时器:新建衔接时等候ACK应对的定时器,超出时刻后会封闭衔接。
  • FIN_WAIT2定时器:封闭衔接时等候ACK的定时器,超时后会撤销“封闭衔接”。
  • ER推迟定时器、PTO定时器、TIME_WAIT定时器:这三玩意儿没研讨过。

3.3、“面向无衔接”的UDP不牢靠传输协议

UDP(User Datagram Protocol)协议是传输层的一个不牢靠传输协议,它为运用程序供给了一种无需树立衔接就能够发送封装的IP数据包的方法。在传输层中,与TCP协议互补,UDP除了给运用层供给了发送数据包的功用外,简直没有做任何其他工作。而面向衔接的TCP恰恰相反,简直做了一切的工作。

刚刚提到过,UDP仅为运用层供给了发送数据报的功用,首要便是指UDPIP协议的扩大:

  • ①树立在IP协议的根底上,扩展出端口号,可使数据分发到详细的运用程序。
  • ②树立在IP协议的根底上,扩展出数据传输进程中的数据过失效验机制。

接下来先看看UDP的报文头结构。

3.3.1、UDP的报文头

(一)Java网络编程之计网基础、TCP-IP协议簇、TCP、UDP协议及腾讯QQ通信原理综述

对比TCP杂乱的报文头结构,UDP的头部就显得比较简略了,整个头共8字节:

  • ①源端口/意图端口:指数据发送方的运用进程端口号及接纳方的进程端口号。
  • ②报文长度:Header+Data的总长度,由于UDP头为8字节,所以该值最小为8
  • 效验和:检测UDP数据报在传输中是否有错,有则丢掉(UDP查验和并非有必要的),就算效验时检测犯过错,也仅仅仅丢掉数据包,不会对数据进行纠正,也便是不会重发数据报。

3.3.2、UDP中心流程

UDP是一个无衔接的协议,因而选用UDP传输协议的程序,在传递数据时,不会存在树立/开释衔接的进程。当数据需求传输时,会关于运用层的数据简略的封装,也便是加上自己的UDP头后,直接会将数据丢给IP层,然后交由链路传输。

正由于如上特性,因而UDP的传输速度仅受到数据生成的速度、核算机算力和传输带宽的约束。

在接纳端,UDP会把每个音讯段放在队列/缓冲区中,程序每次从队列中读一个音讯段。当然,接纳端收到数据后,也会对数据做效验,但效验完结后,如若数据存在过失,那UDP只会单纯的丢掉该数据包,不会要求发送端重发数据。

由于由于UDP高效的传输功用,因而常备运用在播送告知、音频通话、视频传输等多媒体数据流业务,而且这类业务中,假如有一个数据包丢掉,在很短的时刻内就会有另一个新的数据就会替换它,因而就算数据传输不牢靠也无关紧要。

3.3.3、UDP中的丢包问题

由于UDP的不牢靠传输,因而数据呈现丢包是很常见的工作,一般UDP中造成数据丢包的原因首要如下:

  • ①接纳端处理数据时刻过长,导致不同包之间的数据处理间隔时刻过长,造成丢包。
  • UDP单个数据包过大,导致缓冲区快速被填满,接纳端程序来不及处理造成丢包。
  • ③发送端数据发送频率过快,接纳端处理速度跟不上,然后导致数据丢包。
  • ④发/收两边之间存在网络不稳定,导致数据无法正常分发,然后导致丢包。
  • 一般来说,丢包的原因很简略,要么是网络问题,要么便是接纳方处理速度跟不上导致的。
丢包问题处理计划
  • ①假如是数据包过大造成丢包,那么则能够切开数据后分批次发送。
  • ②假如是发送频率过高导致丢包,能够恰当操控频率/减小流量,或调大缓冲区。
  • ③如是缓冲区最大了,仍是由于处理不过来导致数据丢包,那么能够在程序内再完结一个缓存区,先读取数据到程序中缓存,然后进步接纳端的吞吐量。
  • ④假如程序中关于丢包容忍率很低,那么能够自己完结重发机制,或直接切换TCP完结。

3.3.4、TCP与UDP之间的差异

TCP UDP
面向衔接 面向无衔接
牢靠信息传输 不牢靠信息传输
字节省传输 报文传输
传输速度慢 传输速度快
仅支撑点对点通讯 支撑一对一、一对多、多对多通讯
具有拥塞机制和流量操控 不具有拥塞机制和流量操控
TCP首部至少20个字节 UDP首部仅8个字节

四、腾讯QQ通讯原理剖析

腾讯QQ、微信两运用是国内交际通讯软件中名副其实的“霸主”,其间的QQ是一个依据TCP/UDP两个协议相结合的通讯软件。其间谈天首要选用UDP打洞方法,其次考虑TCP通讯,当然,关于文件传输、表情包发送、QQ空间等是选用TCP传输。

4.1、登录原理

曾经的老版QQ是能够自己挑选登录方法的,也便是用户自己能够选TCPUDP方法登录,如下:

(一)Java网络编程之计网基础、TCP-IP协议簇、TCP、UDP协议及腾讯QQ通信原理综述

但现在的新版QQ中,都是选用依据TCP协议的HTTP方法登录,即与咱们自身做的登录原理大致相同,先经过调用后端接口获取令牌信息,然后认证…..,最后登录完结后,QQ会坚持一条TCP衔接来保持在线状况。

4.2、通讯原理

QQ的首要通讯方法是依据UDP打洞技能,经过服务器中转方法完结的信息传输,这听起来是不是很不可思议?QQ作为“顶级”的谈天软件,怎么能够选用这样的不牢靠方法来传输音讯呢?

这里边牵扯到许多原因,有前史原因,也综合考虑了服务器负载、网络杂乱度、服务器数量/网络带宽本钱问题、完结难度等多方面因素导致的。

由于UDP传输不牢靠,因而腾讯选用了上层协议来确保牢靠传输:假如客户端运用UDP协议宣布音讯后,服务器收到该包,需求运用UDP协议发回一个应对包,经过这种方法来确保音讯无遗漏的传输。

不过有时分之所以会看到“音讯发送失利的赤色感叹号”,但对方又收到了这个音讯的状况,便是由于客户端宣布的音讯,服务器现已收到并转发成功,但客户端由于网络原因没有收到服务器的应对包引起的。
也包含网络比较差的状况下,QQ信息发送之后,对方接纳到的次序跟你宣布的不共同,这个也是由于UDP无序导致的。

4.3、文件传输原理

A想要向B传输一个文件时,A首要会向服务器宣布一个文件传输的恳求,服务器接纳到该恳求后,会将其转发给B,一同会将A的临时IP发送给B,假如A、B两个客户端在同一内网,那么B会直接尝试衔接A,然后抵达文件传输的意图。
但如若A、B并不在同一个局域网,那么A的文件传输操作就会由服务器进行文件中转,由于服务器具有公网IP,因而A、B两个客户端都能够衔接到服务器,于是A、B终究就经过这种中转的方法顺利达成文件传输的意图。

4.4、音/视频通话原理

前面提到过,QQ的文字谈天简直都是经过服务器中转的方法工作的,由于这种方式一方面能够确保“记载同步到云端”,另一方面也方便“刑事侦办”。
但音/视频通话,数据传输全经过服务器中转,关于服务器是一个沉重的担负,所以QQ的音/视频通话本质上是经过NAT穿透+P2P对等通讯完结的,当然,在P2P直接通讯失利时,会退而求次,服务器介入处理,经过中转形式完结传输。

大约进程如下:

  • A打算与B进行视频通话,那会在“发动时”向服务器发送一个“通话恳求”。
  • 服务器接纳到恳求后,会先获取通话两边的IP/Prot,然后将其彼此交换。
  • 服务器协助穿透NATA、B两边依据服务器分发的地址树立衔接。
  • A、B两边衔接对端地址,然后彼此传递数据,然后抵达通话数据传输的意图。

从如上进程中能够得出:QQ客户端之间“通话”,假如能够直接P2P通讯,则服务器把他们各自的公网IP、端口号分发给彼此,这样他们的流量数据能够P2P传输,服务器在其间只分发QQ客户端IP、端口号信息,不会担负太大。但假如P2P通讯失利,服务器会介入,选用服务器中转方法完结。

假如NAT无法穿透,那则无法进行P2P通讯,无法穿透的原因也或许由于地理位置、网络类型约束等多方面因素导致。

P2P通讯翻译过来也便是端到端通讯,在P2P模型中,服务器只作为客户端地址的中转站存在,不需求承当昂扬的流量本钱。

4.5、腾讯QQ原理剖析小结

在上述进程中,咱们只能大约剖析QQ通讯其间的原理,并不能确保这是腾讯内部详细的完结计划,由于细致的详细进程只要腾讯自己了解。也包含其详细完结定然杂乱千百万倍,并非片言只语之间就可论说清楚,因而关于QQ通讯原理的剖析部分,大约了解其原理即可。

五、核算机网络根底与网络传输协议总结

在本章中,关于核算机网络的根底内容进行了全面论说,从开端的核算机网络起源开端,到常见的网络系统、网络分层结构、IP网络协议、TCP牢靠传输协议、UDP不牢靠传输协议以及腾讯QQ软件原理剖析等多块内容进行了剖析,本章旨在先为后续华章打下网络编程的根底,方便后续撰写其他内容时做好预备。