【计算机网络总结一】TCP/IP协议、

文章参考链接 :

 https://www.jianshu.com/p/c793a279f698

http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html

http://www.ruanyifeng.com/blog/2012/06/internet_protocol_suite_part_ii.html

本篇文章非原创,站在巨人的肩膀上摘苹果。


我们每天都在使用互联网,可否真正想过他是如何实现的?我们插上网线或者链接WiF就能够立马联网是多么的神奇。

互联网的实现分为好几个层,每一次都有自己的功能。类似建筑物,层层依赖。

我们接触到的只是最上面一层,根本没感觉到下面的层级。要想了解必须曾下层开始,自下而上理解每一层的功能。

其中最经典的就是OSI七层数据模型。(现在简化来说层数合并为四层)


【计算机网络总结一】TCP/IP协议、_第1张图片

OSI模型:

Open System Interconnection Reference Model 全名“开放式系统互联通信参考模型”,是一个试图使各种计算机在全世界范围内互联为网络的标准框架。1983年,国际标准组织(ISO)发布了著名的ISO/IEC 7498标准,它定义了网络互联的7层框架,也就是开放式系统互联参考模型。

为什么需要协议?

协议是一种双方都明白或者必须遵守的事先约定。

为了把全世界的所有不同类型的计算机都连接起来,就必须规定一套全球通用的协议。为了实现这个目标,互联网协议簇(Internet Protocol Suite)就成为了通用协议标准。

互联网协议包含了上百种协议,但是最重要的两个协议是TCP和IP协议,而我们通常把基于TCP和IP协议的所有协议统称为”TCP/IP协议(族)”。

 


1.物理层

【计算机网络总结一】TCP/IP协议、_第2张图片

我们电脑想要组网,第一件事做什么?当然是先把电脑连起来,可以用光缆、电缆、无线电波(WiFi)等方式。

物理层的作用就是通过物理手段吧电脑连接起来,它主要是规定了网络的一些电气特征,作用是负责传送0和1的电信号。

用物理设备将各个“局域网”相连组成更大的“局域网”,更大的局域网层层相连最终组成了“互联网”。

2.数据链路层

①.定义

物理层是传输电路的0和1信号的,但是单纯的0和1是没有意义的,必须规定解读方式:多少个0和1算一组?每个信号代表什么意义?---这就是链路层的意义,他在物理层的上方,确定了0和1的分布方式。

②.以太网协议

早期,各个公司都有自己的电信号分组方式,后来出现了“以太网”这种协议占据主导地位。

以太网规定:一组电信号构成一个数据包,叫做帧,每个帧分为两部分:标头和数据。

因此链路层的数据包又叫做“以太网数据包”。他由标头 和数据两部分组成。其中标头包含数据包的说明项:比如发送者,接受者,数据类型等。

标头长度固定18个字节。数据长度46-1500字节。因此,整个"帧"最短为64字节,最长为1518字节。如果数据很长,就必须分割成多个帧进行发送。

③.MAC地址

【计算机网络总结一】TCP/IP协议、_第3张图片

以太网数据包的标头包含了发送者和接受者的信息,那么如何去标识呢?

以太网规定连入网络的所有设备都必须具有网卡接口,数据包必须是从一块网卡传送到另外一块网卡,网卡的地址就是数据包的发送和接收地址,也叫MAC地址。

每个网卡出厂时候,都有全世界独一无二的MAC地址,长度48位的二进制,通常用12个十六进制数表示。

前6个十六进制是厂商编号,后6个是该厂商的网卡流水号。有了MAC地址,就可以定位网卡和数据包的路径了。


【计算机网络总结一】TCP/IP协议、_第4张图片

④.广播

【计算机网络总结一】TCP/IP协议、_第5张图片

以太网数据包必须知道接收方的MAC地址,然后才能发送。

就算有了MAC地址,系统怎样才能把数据包准确送到接收方?

以太网采取了一种很原始的广播式方式。它不是把数据准确的送到接收方,而是向本网络(局域网)内所有的计算机发送,让每台计算机自己判断,是否为接收方。

一台计算机向本局域网内的所有电脑均发送相同的数据包,其他计算机收到这个数据包之后,会读取这个数据包的“标头”,找到其中接收方(目标方)的MAC地址,然后与自身的MAC地址进行比对,如果两者相同,说明就是要发给自己的,然后接受这个包并做出进一步的处理,否则丢弃这个包。

3.网络层

【计算机网络总结一】TCP/IP协议、_第6张图片

理论上依靠MAC地址和广播技术,深圳的网卡发出的数据可以找到洛杉矶的网卡了,但是如果全世界的计算机都这么操作,那么每一台计算机发出的数据都同步广播到全世界,再一一对比判断,这样显然低效不现实的。

广播是在发送者所在的局域网内广播的,不同也就是说,如果两台计算机没有在同一个子网(局域网)内,是无法通过广播直接传过去的。互联网是由一个个子网(局域网)组成的更大的子网,一级一级组网。

因此我们必须找到一种方法,区分那些MAC地址属于同一个子网。如果是同一个子网则采取广播的形式。如果不是,则采取“路由”的方式发送。

-------这就导致了"网络层"的诞生。它的作用是引进一套新的地址,使得我们能够区分不同的计算机是否属于同一个子网络。这套地址就叫做"网络地址",也即是"网址"。

于是,"网络层"出现以后,每台计算机有了两种地址,一种是MAC地址,另一种是网络地址。两种地址之间没有任何联系,MAC地址是绑定在网卡上的,网络地址则是管理员分配的,它们只是随机组合在一起。

网络地址帮助我们确定计算机所在的子网络,MAC地址则将数据包送到该子网络中的目标网卡。因此,从逻辑上可以推断,必定是先处理网络地址,然后再处理MAC地址。

①.IP协议

规定网络地址的协议,叫IP协议。他定义的地址就叫做“IP地址”。IP地址目前有IPV4和IPV6两种。2011年,IPV4地址完全用尽的时候,IPV6让处于部署的初七,因此IPV4地址也是目前最广泛的IP地址---这个版本规定网络地址由32个二进制位组成,我们分成四段十进制数标识IPV4地址,从0.0.0.0到255.255.255.255


【计算机网络总结一】TCP/IP协议、_第7张图片

互联网的每一台计算机都会被分配一个IP地址,这个地址由两部分组成:网络号+主机号。

比如:IP地址172.163.254.1,这是一个32位的地址,假定他的网络部分是前24位(172.163.254)则主机部分就是后8位(最后的那个1)。那么处于同一个子网络的电脑,他们IP地址的网络部分必定是相同的,也就是说172.163.254.1 和 172.163.254.2 处在同一个子网络。后面的1 和 2 则是同一子网内两台不同电脑的主机编号。

②.子网掩码

接上面所说,单单从IP地址,我们无法判断网络部分。仍然以172.163.254.1为例,到底是前24位还是前16位,我们从IP地址上是看不出来的。那么如何才能从IP地址判断两台计算机是否属于同一个子网络?就要用另外一个参数“子网掩码

所谓的子网掩码,就是表示子网络特征的参数。他在形式上等同于IP地址,也是一个32位二进制数字,他的网络部分全部都为1,主机部分全部都为0。

比如:IP地址172.163.254.1如果已知网络部分是前24位,主机部分是后8位。则子网掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。

知道了子网掩码,我们就能判断任意两个IP是否处于同一个子网络。方法是:将两个IP地址与子网掩码分别进行AND运算,(两个数位都为1,运算结果为1,否则为0),然后比较结果是否相同,如果是的话,就表明它们在同一个子网络中,否则就不是。

②IP数据包

根据IP协议发送的数据都叫做IP数据包。

但是前面说过,以太网数据包只包含MAC地址,并没有IP地址的栏位。那么是否需要修改数据定义,再添加一个栏位呢?

回答是不需要,我们可以把IP数据包直接放进以太网数据包的"数据"部分,因此完全不用修改以太网的规格。这就是互联网分层结构的好处:上层的变动完全不涉及下层的结构。

具体来说,IP数据包也分为"标头"和"数据"两个部分。


【计算机网络总结一】TCP/IP协议、_第8张图片

"标头"部分主要包括版本、长度、IP地址等信息,"数据"部分则是IP数据包的具体内容。它放进以太网数据包后,以太网数据包就变成了下面这样。

【计算机网络总结一】TCP/IP协议、_第9张图片

IP数据包的"标头"部分的长度为20到60字节,整个数据包的总长度最大为65,535字节。因此,理论上,一个IP数据包的"数据"部分,最长为65,515字节。前面说过,以太网数据包的"数据"部分,最长只有1500字节。因此,如果IP数据包超过了1500字节,它就需要分割成几个以太网数据包,分开发送了。

②DNS域名系统 

域名系统是一个分布的数据库,它提供将主机名(举例: localhost.com)转换成IP地址(举例:255.255.255.255)的服务。

 网络中的数据包是通过“端口号+MAC地址+IP地址”来识别目的地址的,也就是说定位一个主机的时候,我么你定位都是他的IP地址。

举例:我们在浏览器输入域名www.google.com却不是谷歌服务器的IP地址,这时候DNS协议起到了作用,当我们按下回车,本机服务器显示请求DNS服务器,DNS服务器根据我们发送的域名,解析成该域名对应的IP地址并返回给本机。

③.路由/路由器/网关/交换机

两台计算机如果在同一子网中,则采用广播+MAC地址的方式发送数据包。如果不是则采取“路由”的方式。那么什么是“理由”呢?

路由

就是通过互联的网络把信息从原地址传输到目的地的活动。路由引导分组转送,经过一些中间的节点后,到他们最后的目的地。而路由器,正是执行这种行为动作的机器。比较特殊的是,原地址和目的地址是在两个不同的子网中。

那么数据如何传输呢?路由它定义了一条路径,经因特网发送包到另一个网络地址,但是路由不定义完全路径,只定义了从主机到可以将包转发到目的地网关间的路径(从一个子网到另一个子网)。

TODO

路由器

TODO

特点:工作在网络层上、能够连接不同类型的网络、能够选择数据传输的路径。

网关

TODO

网络交换机

TODO

4.传输层

①.端口号

有了MAC地址和IP地址,我们就可以在互联网上的任意两个电脑之间建立通信了。

接下来的问题是同一个主机上有许多应用程序(进程)都需要用到网络,比如你浏览网页,边聊天。

当一个数据包从网上发送过来时候,我们需要一个参数来区分他到底是提供那个进程使用的-----这个参数就叫“端口号”。他其实就是每个使用网卡的程序的编号。

  端口是0到65535之间的一个整数,正好16个二进制。0~1023的端口被系统占用,用户只能使用大于1023的端口。不管是浏览网页还是聊天,应用程序都会随机选用一个端口号,然后和服务器建立相应的端口关系。HTTP协议默认使用80端口,8080是用来访问代理服务的。

“传输层”的功能,就是建立“端口到端口”之间的通信。相比之下,“网络层”的功能是建立“主机到主机"的通信。只要确定主机和端口号,我们就能实现程序之间的交流。

②.Socket

传输层是建立 “端口到端口”之间的通信,更具体一点就是程序和程序之间的通信,或者说是“进程间通信”。

TODO

③.UDP/TCP协议

TCP和UDP都是传输层协议,他们主要作用就是在应用层的数据包标头加上端口号(或者在IP协议的数据包中插入端口号)

UDP协议的有点是比较简单(无需连接),容易实现,缺点是可靠性差,一旦数据包发出,不知道对方是否收到。

TCP协议可以近似认为是有确认机制的UDP协议。每发出一个数据包都要求确认。如果有一个数据遗失,就收不到确认。 发出方就知道有必要重发这个数据包了。

5.应用层

应用程序收到传输层的数据就开始进行解读。用于互联网是开放架构,数据来源五花八门,必须事先顶号格式,否则无法解读。“应用层”的作用就是规定应用程序的数据格式。

因为是直接面向用户,因此它主要作用是“消除设备固有数据格式和网络标准数据格式直接的差异”。

在网络流中,数据的格式是标准化的,但是具体到不同设备,不同的操作系统上,他的要求数据呈现格式是不同的。因此需要转化成统一的用户能够感知的声音,图片,文字等信息,这就是应用层要做的事情。




顶向下的数据包结构:

现在我们从一个用户的角度自顶向下的过一遍,一个数据包的过程。首先设置本机参数:

本机IP地址: 192.168.1.100

子网掩码:255.255.255.0

网关IP地址:192.168.1.1

DNS的IP地址:8.8.8.8

打开浏览器访问: www.google.com 按下回车。意味着浏览器要向Google发送一个网页请求的数据包。

第一步:

主机回向DNS服务器发送请求,已知DNS服务器为8.8.8.8,于是发送一个DNS数据包(53端口);然后DNS服务器做出相应,高度我们Google的IP地址为172.194.72.105

第二步:

接下来我们要判断是否在同一子网下。于是用到了子网掩码。已知子网掩码255.255.255.0,本机IP地址 192.168.1.100,做一个二进制的AND运算(两个数位都为1,结果为1,否则为0),计算结果为192.168.1.0;然后对Google的IP地址172.194.72.105也做一个AND运算,计算结果为172.194.72.0。这两个结果不相等,所以结论是,Google与本机不在同一个子网络。

第三步:

必须通过网关192.168.1.1转发,也就是说,接收方的MAC地址将是网关的MAC地址。至此发送的各种必要参数已经基本确定了,数据包也可以发送了。

1.应用层数据包

首先根据HTTP协议详解我么你知道HTTP协议的报文结构:


【计算机网络总结一】TCP/IP协议、_第10张图片

这里是请求的一个GET请求报文,请求谷歌的报文结构也是相同的,只是域名等内容不同罢了。我们假定这个部分的长度为4960字节,此时的数据包结构如下:

【计算机网络总结一】TCP/IP协议、_第11张图片

就是一个单纯的数据包,没有头部,数据部分就是上面的报文。

2.传输层数据包(TCP/UDP数据包)

  TCP/UDP数据包需要设置端口,接收方(Google)的HTTP端口默认是80,发送方(本机)的端口是一个随机生成的1024-65535之间的整数,假定为51775。

  TCP数据包的标头长度为20字节,加上嵌入HTTP的数据包,总长度变为4980字节。

【计算机网络总结一】TCP/IP协议、_第12张图片

可以看到,TCP/UDP数据包就是在应用层数据包前面加上端口号的等必要的寻址信息作为头部。

3.网络层数据包(IP数据包)

 下面就到了网络层,TCP数据包再嵌入IP数据包。IP数据包需要设置双方的IP地址,这是已知的,发送方是192.168.1.100(本机),接收方是172.194.72.105(Google)。

  IP数据包的标头长度为20字节,加上嵌入的TCP数据包,总长度变为5000字节。

【计算机网络总结一】TCP/IP协议、_第13张图片

4.数据链路层数据包(以太网数据包)

最后,IP数据包嵌入以太网数据包。以太网数据包需要设置双方的MAC地址,发送方为本机的网卡MAC地址,接收方为网关192.168.1.1的MAC地址(通过ARP协议得到)。

以太网数据包的数据部分,最大长度为1500字节,而现在的IP数据包长度为5000字节。因此,IP数据包必须分割成四个包。因为每个包都有自己的IP标头(20字节),所以四个包的IP数据包的长度分别为1500、1500、1500、560。

【计算机网络总结一】TCP/IP协议、_第14张图片

分割成四个数据包,分割只能分割数据部分,每个数据包都要具有相同的标头,不然找不到目的地址:

【计算机网络总结一】TCP/IP协议、_第15张图片

服务端响应:

经过多个网关的转发,Google的服务器172.194.72.105,收到了这四个以太网数据包。

根据IP标头的序号,Google将四个包拼起来,取出完整的TCP数据包,然后读出里面的"HTTP请求",接着做出"HTTP响应",再用TCP协议发回来。

本机收到HTTP响应以后,就可以将网页显示出来,完成一次网络通信。

这个例子就到此为止,虽然经过了简化,但它大致上反映了互联网协议的整个通信过程。

我们再总结一下整个过程中数据包的结构包装变化


【计算机网络总结一】TCP/IP协议、_第16张图片

应用层负责产生数据,传输层负责数据分割、可靠传输等,网络层负责数据路由,链路层负责数据的传送。

你可能感兴趣的:(【计算机网络总结一】TCP/IP协议、)