Android开发不得不去了解的网络知识

文/Tamic
http://www.jianshu.com/u/3bbb1ddf4fd5

一 互联技术

虽然作为程序员来讲不必过多的去了解网络互联的相关技术,但是目前互联网已经转向了物联网时代,从刚开始的软件+网络,成为今天的硬件+软件+网络的模式(即物联网)
智能家居, 人工智能的实现模式也是典型的物联网产物。因此有网络基础对成为一个高级软件架构师有着无比轻重的作用,因此接下来几篇文章我会给大家复习下网络相关的知识,

目前主流的互联技术包括小规模的主机互联(局域网)和大规模的主机互联(广域网)。

主机互联一般基于的通信模式有一对一通信(双方)和多对多通信(多方)由以下两种通信方式。

双方通信

–双方信息打包后放到通信线路上发送,就能到达对方。
–在通信线路上只有两方,所收到的信息必然是对方发过来给我的。

多方通信

只将信息打包后就放到通信线路上去发送,那么就无法知道到是从哪儿发来的然后到底底是发给谁的信息。
因此,我们需要给每一个通信终端都编一个号,也就是IP地址(IP地址)。
虽然程序员和硬件扯不上太大的关系,但是我们还是要知道早期的局域网是同过双绞线和同轴电缆当作通信介质,但是由于介质的损耗和带宽问题,目前已采用光纤通信,
采用光速,不仅提高了传输速率,而且减少了损耗。以下两种介质的对比。

Android开发不得不去了解的网络知识_第1张图片

二 网络基础

在大致了解网络通信前,我们必须了解几个概念,IP地址,MAC地址,路由表,TCP/UDP协议,和网络层次模型

OSI 七层模型

Android开发不得不去了解的网络知识_第2张图片

计算机网络通信制定的一个7层框架,协议的七层框架,称为:“OSI/RM"。OSI模型分为七层,依次从底层到上层为,物理层,数据链路层,传输层,会话层,表示层,应用层。每个层此又为上层提供服务,说

TCP/IP 四层模型

Android开发不得不去了解的网络知识_第3张图片
20150706225041737.jpeg

TCP/IP通讯协议采用了4层的层级结构,分别为:

  • 应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。
  • 传输层:它提供了节点间的数据传送服务,如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。
  • 互连网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。
  • 网络接口层:对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据。
    两种层次模型的对比图.

其具体功能前我用现实中的硬件设备来对比一下.

  • 物理层:网卡,网线,集线器,中继器,调制解调器

  • 数据链路层:网桥,交换机

  • 网络层:路由器

  • 网关:工作在第四层传输层及其以上。
    对于稍微有网络基础的开发人员来说这些名词不会太陌生.到这问题又来了什么是网桥,什么是中继器?

  • 中继器
    中继器是局域网环境下用来延长网络距离的最简单最廉价的网络互联设备,操作在OSI的物理层,中继器对在线路上的信号具有放大再生的功能,用于扩展局域网网段的长度(仅用于连接相同的局域网网段)。
    中继器(RP repeater)是连接网络线路的一种装置,常用于两个网络节点之间物理信号的双向转发工作。中继器主要完成物理层的功能,负责在两个节点的物理层上按位传递信息,完成信号的复制、调整和放大功能,以此来延长网络的长度。
    也就说类似生活中变电的变压器功能。

  • 网桥
    网桥不是真实的物质东西,而是一个作用域的代名词,网桥(Bridge)像一个聪明的中继器。中继器从一个网络电缆里接收信号, 放大它们,将其送入下一个电缆。相比较而言,网桥对从关卡上传下来的信息更敏锐一些。网桥是一种对帧进行转发的技术,根据MAC分区块,可隔离碰撞。网桥将网络的多个网段在数据链路层连接起来。
    网桥也叫桥接器,是连接两个局域网的一种存储/转发设备,它能将一个大的LAN分割为多个网段,或将两个以上的LAN互联为一个逻辑LAN,使LAN上的所有用户都可访问服务器

  • 交换机
    交换机就是用来进行报文交换的机器。多为链路层设备(二层交换机),能够进行地址学习,采用存储转发的形式来交换报文.。

  • 路由器
    路由器用来连通不同的网络,另一个作用是选择信息和分发传送的线路功能。选择通畅快捷的近路,能大大提高通信速度,减轻网络系统通信负荷,节约网络系统资源,提高网络系统畅通率。
    具有多个接口,用于连接多个IP子网及多种链路,并实现其互联互通的网络设备。工作在OSI第三层,其主要工作任务是在网络中转发IP数据包

3 MAC地址

Mac地址即设备物理地址,他类似人类的身份证,每个人出生就开始编制了号码,其互联网设备出厂也会标志唯一的mac地址,物理地址由IEEE统一指定和分配,比如联想和惠普就有不同的区段范围的mac地址,其原理和规则是: MAC统一编址,MAC地址长6个字节(48位),全球唯一。前24为OUI,由IEEE分配给各网络厂家。后24位为EUI,由厂家自行分配。

4 路由表

又称全局路由表,存储在路由器的内存中,用于指示路由器发送IP数据包转发至正确目的地的信息表。列如,生活中我们去乘火车,我们只关心目的城市,从上车之前我们并不知道其最近路线,二路由器就里面就保存着我们下一站的信息,火车没到一个站,都要经过铁路公司的统一安排开始进入对应的股道,而路由器就是铁路中的小枢纽站一样。

Android开发不得不去了解的网络知识_第4张图片

5 TCP/IP

上面提到Tcp /IP是一种互联网通信协议,它包括四层模型,各自进行自己的职责。TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求。通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地

  • IP
    IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层---TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是否按顺序发送的或者有没有被破坏,IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。
    高层的TCP和UDP服务在接收数据包时,通常假设包中的源地址是有效的。也可以这样说,IP地址形成了许多服务的认证基础,这些服务相信数据包是从一个有效的主机发送来的。IP确认包含一个选项,叫作IP source routing,可以用来指定一条源地址和目的地址之间的直接路径。对于一些TCP和UDP的服务来说,使用了该选项的IP包好像是从路径上的最后一个系统传递过来的,而不是来自于它的真实地点。这个选项是为了测试而存在的,说明了它可以被用来欺骗系统来进行平常是被禁止的连接。那么,许多依靠IP源地址做确认的服务将产生问题并且会被非法入侵。

  • TCP

TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于端到端的通讯。
TCP提供的是一种可靠的数据流服务,采用“带重传的肯定确认”技术来实现传输的可靠性。TCP还采用一种称为“滑动窗口”的方式进行流量控制,所谓窗口实际表示接收能力,用以限制发送方的发送速度。
如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向‘上’传送到TCP层。TCP将包排序并进行错误检查,同时实现虚电路间的连接。TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。
TCP将它的信息送到更高层的应用程序,例如Telnet的服务程序和客户程序。应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方。
面向连接的服务(例如Telnet、FTP、rlogin、X Windows和SMTP)需要高度的可靠性,所以它们使用了TCP。DNS在某些情况下使用TCP(发送和接收域名数据库),但使用UDP传送有关单个主机的信息。

常见Tcp的端口号

Android开发不得不去了解的网络知识_第5张图片
EC213DC8-7090-4E97-944C-742785D2E4F0.png
  • UDP
    UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送(单播、广播、组播)。
    UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出现丢包现象,实际应用中要求程序员编程验证。
    UDP与TCP位于同一层,但它不管数据包的顺序、错误或重发。因此,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查询---应答的服务,例如NFS。相对于FTP或Telnet,这些服务需 要 交换的信息量较小。使用UDP的服务包括NTP(网络时间协议)和DNS(DNS也使用TCP)。
    欺骗UDP包比欺骗TCP包更容易,因为UDP没有建立初始化连接(也可以称为握手)(因为在两个系统间没有虚电路),也就是说,与UDP相关的服务面临着更大的危险。

文/Tamic
http://www.jianshu.com/u/3bbb1ddf4fd5
常见Tcp的端口号:

Android开发不得不去了解的网络知识_第6张图片
8E4F312C-C7FE-412F-B495-DC1B6E44AE5A.png
  • ICMP

ICMP与IP位于同一层,它被用来传送IP的控制信息。它主要是用来提供有关通向目的地址的路径信息。ICMP的‘Redirect’信息通知主机通向其他系统的更准确的路径,而‘Unreachable’信息则指出路径有问题。另外,如果路径不可用了,ICMP可以使TCP连接‘体面地’终止。PING是最常用的基于ICMP的服务。

  • 端口
    TCP和UDP服务通常有一个客户/服务器的关系,例如,一个Telnet服务进程开始在系统上处于空闲状态,等待着连接。用户使用Telnet客户程序与服务进程建立一个连接。客户程序向服务进程写入信息,服务进程读出信息并发出响应,客户程序读出响应并向用户报告。因而,这个连接是双工的,可以用来进行读写。
    两个系统间的多重Telnet连接是如何相互确认并协调一致呢?TCP或UDP连接唯一地使用每个信息中的如下四项进行确认:

*源IP地址 发送包的IP地址。
*目的IP地址 接收包的IP地址。
*源端口 源系统上的连接的端口。

  • 目的端口 目的系统上的连接的端口。

    端口是一个软件结构,被客户程序或服务进程用来发送和接收信息。一个端口对应一个16比特的数。服务进程通常使用一个固定的端口,例如,SMTP使用25、Xwindows使用6000。Tomcat的端口:8080,这些端口号是‘广为人知’的,因为在建立与特定的主机或服务的连接时,需要这些地址和目的地址进行通讯,列如我们去建立聊天通讯的指定的自定义端口(8090)。

  • 数据格式

数据帧:帧头+IP数据包+帧尾 (帧头包括源和目标主机MAC初步地址及类型,帧尾是校验字)
IP数据包:IP头部+TCP数据信息(IP头包括源和目标主机IP地址、类型、生存期等)
TCP数据信息:TCP头部+实际数据 (TCP头包括源和目标主机端口号、顺序号、确认号、校验字等)
常见的以太帧结构

  • IP地址

在因特网上连接的所有计算机,从大型机到微型计算机都是以独立的身份出现,我们称它为主机。为了实现各主机间的通信,每台主机都必须有一个唯一的网络地址。就好像每一个住宅都有唯一的门牌一样,才不至于在传输资料时出现混乱。
Internet的网络地址是指连入Internet网络的计算机的地址编号。所以,在Internet网络中,网络地址唯一地标识一台计算机。我们都已经知道,Internet是由几千万台计算机互相连接而成的。而我们要确认网络上的每一台计算机,靠的就是能唯一标识该计算机的网络地址,这个地址就叫做IP(Internet Protocol的简写)地址,即用Internet协议语言表示的地址。
在Internet里,IP地址是一个32位的二进制地址,为了便于记忆,将它们分为4组,每组8位,由小数点分开,用四个字节来表示,而且,用点分开的每个字节的数值范围是0~255,如202.116.0.1,这种书写方法叫做点数表示法。

IP包的头文件结构:

Android开发不得不去了解的网络知识_第7张图片
20150706232417667.png
 对有着开发经验的程序员来说,概念或许你并不知道,但是你知道socket建立时我需要指定目标地址,和主机端口号。而这些是怎么IP协议发送过去的呢,首先发送方进行封包,路由器进行不断转发,最后找到目标主机进行拆包,然后读取信息。
网络建立连接有个三次握手协议,通俗讲,小时候你出去玩了,你很饿,你就喊妈妈,问妈妈饭最好了吗,你妈妈说好了,你说可以过去吃饭吗,妈妈说可以了,这样你才能回家吃饭。计算机通信也是这样。

如下图,A向B请求,B收到后应答给A,然后A收到B的应答信息后再继续应答B, B收到后双方建立连接。 注意:后面我们程序的非对称加密协议和网网络连接一样类似,后面我会讲到。

Android开发不得不去了解的网络知识_第8张图片
20150706233452808-1.png

当我的连接建立时我通常开始主机A的封包和主机B的解包,当然解包是封包的逆过程,通常称为完整的一次连接。

Android开发不得不去了解的网络知识_第9张图片
20150706234100069.png

这里我们还需要知道两个概念DNS和ARP

  • DNS
    提供域名解析服务将URL中的域名解析成IP地址
  • ARP
    将IP地址解析成MAC地址

通过今天的学习,我们可以大概了解下TCP/IP的架构分布和传输协议,以及网络通讯的术语和各自功能,包括几种连接方式,其建立成功连接需要的必要数据结构,曾经记得有次面试
遇到了有关网络的面试题,有可能面试官懂点网络基础,想来虐虐我,最后没想到我从头讲到尾,但遗憾的是我还是未被录取。在下面的几篇文章中,我大致会给大家介绍下网络分布拓扑和
网络安全知识和数据加解密的有关知识,但只限于作为程序员来讲方面的知识。欢迎阅读。

文/Tamic
http://www.jianshu.com/u/3bbb1ddf4fd5

你可能感兴趣的:(Android开发不得不去了解的网络知识)