热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

文Tamichttp:www.jianshu.comu3bbb1ddf4fd5一互联技术虽然作为程序员来讲不必过多的去了解网络互联的相关技术,但是目前互联网已经转向了物联网时代,从

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

一 互联技术

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

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

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

双方通信

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

多方通信

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

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

二 网络基础

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

OSI 七层模型

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

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

TCP/IP 四层模型

《Android开发不得不去了解的网络知识》 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开发不得不去了解的网络知识》

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开发不得不去了解的网络知识》 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开发不得不去了解的网络知识》 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开发不得不去了解的网络知识》 20150706232417667.png

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

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

《Android开发不得不去了解的网络知识》 20150706233452808-1.png

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

《Android开发不得不去了解的网络知识》 20150706234100069.png

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

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

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

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


推荐阅读
  • Panabit应用层流量管理解决方案
    Panabit是一款国内领先的应用层流量管理解决方案,提供高度开放且免费的专业服务,尤其擅长P2P应用的精准识别与高效控制。截至2009年3月25日,该系统已实现对多种网络应用的全面支持,有效提升了网络资源的利用效率和安全性。 ... [详细]
  • 本文详细介绍了在CentOS 6.5 64位系统上使用阿里云ECS服务器搭建LAMP环境的具体步骤。首先,通过PuTTY工具实现远程连接至服务器。接着,检查当前系统的磁盘空间使用情况,确保有足够的空间进行后续操作,可使用 `df` 命令进行查看。此外,文章还涵盖了安装和配置Apache、MySQL和PHP的相关步骤,以及常见问题的解决方法,帮助用户顺利完成LAMP环境的搭建。 ... [详细]
  • 作为软件工程专业的学生,我深知课堂上教师讲解速度之快,很多时候需要课后自行消化和巩固。因此,撰写这篇Java Web开发入门教程,旨在帮助初学者更好地理解和掌握基础知识。通过详细记录学习过程,希望能为更多像我一样在基础方面还有待提升的学员提供有益的参考。 ... [详细]
  • 理解和应用HTTP请求中的转发与重定向机制
    在HTTP请求处理过程中,客户端发送请求(通常简称为req),服务器进行相应处理后返回响应(通常简称为res)。理解和应用客户端的转发与重定向机制是前端开发的重要内容。这两种机制在Web开发中具有关键作用,能够有效管理和优化用户请求的处理流程。转发机制允许服务器内部将请求传递给另一个资源,而重定向则指示客户端向新的URL发起新的请求,从而实现页面跳转或资源更新。掌握这些技术有助于提升应用的性能和用户体验。 ... [详细]
  • 本文作为探讨PHP依赖注入容器系列文章的开篇,将首先通过具体示例详细阐述依赖注入的基本概念及其重要性,为后续深入解析容器的实现奠定基础。 ... [详细]
  • 掌握PHP框架开发与应用的核心知识点:构建高效PHP框架所需的技术与能力综述
    掌握PHP框架开发与应用的核心知识点对于构建高效PHP框架至关重要。本文综述了开发PHP框架所需的关键技术和能力,包括但不限于对PHP语言的深入理解、设计模式的应用、数据库操作、安全性措施以及性能优化等方面。对于初学者而言,熟悉主流框架如Laravel、Symfony等的实际应用场景,有助于更好地理解和掌握自定义框架开发的精髓。 ... [详细]
  • 本课程详细介绍了如何使用Python Flask框架从零开始构建鱼书应用,涵盖高级编程技巧和实战项目。通过视频教学,学员将学习到Flask的高效用法,包括数据库事务处理和书籍交易模型的实现。特别感谢AI资源网提供的课程下载支持。 ... [详细]
  • Nginx入门指南:从零开始掌握基础配置与优化技巧
    Nginx入门指南:从零开始掌握基础配置与优化技巧 ... [详细]
  • 帝国CMS中的信息归档功能详解及其重要性
    本文详细解析了帝国CMS中的信息归档功能,并探讨了其在内容管理中的重要性。通过归档功能,用户可以有效地管理和组织大量内容,提高网站的运行效率和用户体验。此外,文章还介绍了如何利用该功能进行数据备份和恢复,确保网站数据的安全性和完整性。 ... [详细]
  • 深入解析Linux内核中的进程上下文切换机制
    在现代操作系统中,进程作为核心概念之一,负责管理和分配系统资源,如CPU和内存。深入了解Linux内核中的进程上下文切换机制,需要首先明确进程与程序的区别。进程是一个动态的执行流,而程序则是静态的数据和指令集合。进程上下文切换涉及保存当前进程的状态信息,并加载下一个进程的状态,以实现多任务处理。这一过程不仅影响系统的性能,还关系到资源的有效利用。通过分析Linux内核中的具体实现,可以更好地理解其背后的原理和技术细节。 ... [详细]
  • 在使用 SQL Server 时,连接故障是用户最常见的问题之一。通常,连接 SQL Server 的方法有两种:一种是通过 SQL Server 自带的客户端工具,例如 SQL Server Management Studio;另一种是通过第三方应用程序或开发工具进行连接。本文将详细分析导致连接故障的常见原因,并提供相应的解决策略,帮助用户有效排除连接问题。 ... [详细]
  • 在Ubuntu系统中配置Python环境变量是确保项目顺利运行的关键步骤。本文介绍了如何将Windows上的Django项目迁移到Ubuntu,并解决因虚拟环境导致的模块缺失问题。通过详细的操作指南,帮助读者正确配置虚拟环境,确保所有第三方库都能被正确识别和使用。此外,还提供了一些实用的技巧,如如何检查环境变量配置是否正确,以及如何在多个虚拟环境之间切换。 ... [详细]
  • 在 CentOS 6.6 系统中搭建 MONO 和 Jexus 以支持 ASP.NET 及 MVC 应用的运行环境配置指南
    本文提供了在 CentOS 6.6 系统上配置 MONO 和 Jexus 以支持 ASP.NET 及 MVC 应用的详细步骤。首先,确保本机环境为 CentOS 6.6,并使用阿里云的 YUM 源来安装必要的软件包,包括 gcc、gcc-c++、bison、pkgconfig 和 glib2-devel。这些软件包是构建和运行 MONO 环境的基础,确保系统能够顺利支持 ASP.NET 和 MVC 应用的部署和运行。 ... [详细]
  • 2016-2017学年《网络安全实战》第三次作业
    2016-2017学年《网络安全实战》第三次作业总结了教材中关于网络信息收集技术的内容。本章主要探讨了网络踩点、网络扫描和网络查点三个关键步骤。其中,网络踩点旨在通过公开渠道收集目标信息,为后续的安全测试奠定基础,而不涉及实际的入侵行为。 ... [详细]
  • 西北工业大学作为陕西省三所985和211高校之一,虽然在农业和林业领域不如某些顶尖院校,但在航空航天领域的实力尤为突出。该校的计算机科学专业在科研和教学方面也具有显著优势,是考研的理想选择。 ... [详细]
author-avatar
翟志军2502905177
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有