zoukankan      html  css  js  c++  java
  • 网络编程(一)

    一 客户端/服务端架构

    1. 硬件 C/S 架构

    2. 软件 C/S 架构

      互联网处处是 C/S 架构的

      如一个网站就是服务端,浏览器是客户端( B/S 架构)

    3. 服务端需要遵循的原则:

      1. 服务端与客户端都需要有惟一的地址,但是服务端的地址必须固定/绑定
      2. 对外一直提供服务,需要稳定运行
      3. 服务端需要支持并发
    4. 网络

      网络建立的目的是为了数据交互(通信)

      如何实现通信:

      1. 建立好底层的物理连接介质
      2. 有一套统一的通信标准,称之为互联网协议
    5. 互联网协议:就是计算机界的标准语言

    二 七层模型总览

    互联网的实现,总共可以分为七层.每一层都靠下一层的支持.用户接触的是第七层,也就是应用层.想要理解互联网协议,必须从最下层开始,自下而上理解每一层的功能.

    OSI 模型可以分为七层,五层,四层,其实都是一个道理,只不过合并了几层而已.从下而上分别为:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层.

    每层运行常见的物理设备:

    三 tcp/IP 五层模型理解

    一般讲应用层,表示层,会话层并做应用层,从 tcp/IP 五层协议的角度来阐述每层的由来和功能,搞清楚了每层的主要协议也就理解了互联网通信的原理.

    每层都运行特定的协议,越往上越靠近用户,越往下越靠近硬件.

    一 物理层

    物理层也可以称之为实体层.电脑想要互相通信,第一件事先要把电脑连起来,可以用光缆,电缆等方式实现通信.这就叫实体层,它就是把电脑连接起来的物理手段.它主要规定了网络的一些电器特性.它的功能室基于电器特性发送高低电压(电信号),高电压对应数字1,低电压对应数字0.

    二 数据链路层

    物理层单纯的传输电信号0和1没有任何意义,必须规定电信号多少位一组,每组什么意思.

    数据链路层的功能:定义了电信号的分组方式,这就是数据链路层的功能,它在物理层的上方,确定了0和1的分组方式.

    1 以太网协议

    早期的时候各个公司都有自己的分组方式,后来形成了统一的标准,即以太网协议 Ethernet.

    Ethernet 规定

    • 一组电信号构成一个数据包,也叫数据帧
    • 每一组数据帧分成:报头 head 和数据 data 两部分

    报头包含数据包的一些说明项,比如发送者的源地址,接受者的源地址以及数据类型等等.

    • 发送者/源地址: 6个字节
    • 接受者/目标地址: 6个字节
    • 数据类型: 6个字节

    数据则是数据包的具体内容

    • 数据包最短为46字节,最长为1500字节

    所以一个数据帧的长度最短为64字节,最长1518字节,超过最大限制就分片发送.

    2 mac 地址

    head 中包含的源地址和目标地址的由来: Ethernet 规定接入 Internet 的设备都必须具备网卡,发送端和接收端的地址便是指网卡的地址,即MAC 地址.

    mac 地址:每块网卡出厂时都被烧制上世界上一个惟一的MAC 地址,长度为48位2进制,通常由12位16进制数表示(前六位是厂商编号,后六位是流水线号)

    装了好多次虚拟机,我现在也不知道那个是我的了...

    3 广播

    定义MAC 地址只是第一步,在一部电脑第一次接入局域网的时候,是怎么知道它的MAC 地址的呢.在局域网内通信都是通过MAC 地址来发包收包的,只要知道了对方的MAC 地址才可以互相通信.这就要靠ARP(addres resolution protocol) 协议来获取MAC 地址了,那么 arp 协议是如何解析出对方的MAC 地址呢?

    这里等到了网络层再来解释.

    注意:以太网数据包必须知道接收方的MAC 地址,才能发包.

    那么在同一个局域网内,知道了对方的MAC 地址,系统怎样才能把数据包准确送到接收方呢?

    以太网采用了一种很'原始'的方式,它并不是直接把数据包发到接收方,而是向局域网内所有的计算机发送,让每台计算机自己拆包后判断自己是否为接收方(前提知道对方MAC 地址)

    上图中,1号计算机向2号计算机发送一个数据包,局域网内其他的计算机都会收到这个包.他们读取数据包的报头,找到接收方得MAC 地址,然后与自身的MAC 地址相比较,如果两者相同,就接收这个包,做进一步的处理,不相同的话就丢弃这个数据包.这种发送方式叫'广播'.

    有了数据包的定义,网卡的MAC 地址,广播的发送方式,数据链路层就可以在同一局域网内的计算机之间传送数据了.

    三 网络层

    1 网络层的由来

    以太网协议,依靠MAC 地址发送数据,但这仅仅只能在同一个局域网内发送数据.理论上,依靠MAC 地址,是可以和全球任何一个MAC 地址发送数据的,因为MAC 地址是惟一的.但是这样做有一个致命的缺陷.

    以太网依靠广播方式发送数据包,而广播就意味着每个人都要发送一份,那么全球这么多的计算机,在找到对方的MAC 地址之前都要发一份无疑会造成巨大的浪费,而且效率极低,而且局限在发送者的局域网.也就是说,如果两台计算机不在同一个局域网,广播是传不过去的.这种设计是合理的,否则的话互联网上每一台计算机都会收到所有包,那会引起灾难.

    互联网可以想象成由无数个局域网组成的一个巨型网络,如果想要跨局域网通信必须找到另一种方式,能够区分哪些MAC 地址属于同一个局域网,哪些不属于同一个局域网.如果是同一个局域网的话,就采用广播发送(如何知道对方的MAC 地址),否则就采用'路由'的方式发送.('路由'的意思,就是指如何向不同局域网发送数据包)

    这就导致了'网络层'的诞生.它的作用是引进一套新的地址,使得我们能够区分不同的计算机是否属于同一个局域网.这套地址叫做'网络地址',简称'网址'.

    于是,网络层出现以后,每台计算机有了两种地址,一种是MAC 地址,另一种是网络地址.两种地址之间没有任何联系,MAC 地址是绑定到网卡上的,网络地址则是由MAC 服务器分配的,当一台计算机第一次联网时,会向MAC 服务器发送一个包,然后MAC 服务器会分配好网络地址.

    网络地址帮助我们确定计算机所在的局域网,MAC 地址则将数据包发送到该局域网中的目标MAC 地址.因此从逻辑上判断,必定是先处理网络地址,然后处理MAC 地址.

    可以这样理解,互联网中的通信都是MAC 地址互相发送数据包,而网络地址是为了帮我们确认需要往哪个局域网里面的目标MAC 地址发送数据包,两者缺一不可.

    2 IP 协议

    规定网络地址的协议,叫做 IP 协议.它定义的地址,称为 IP 地址.

    目前,广泛采用的是 IP 协议第四版,简称 IPV4.这个版本规定,网络地址由32个二进制位组成.

    可以看出我的 IP 地址为192.168.11.95,习惯上,用四段的十进制数表示 IP 地址,从0.0.0.0到255.255.255.255.

    IP 地址一般分为5类:A,B,C,D,E 类, D 和E 类为其他用途的.

    可以看粗来 IP 地址是有限的,而且现在的 IPV4 地址已经分完了,以后使用的就是 IPV6了,据说世界上的每一粒沙子都有一个惟一的 IP 地址.

    互联网上的每一台计算机,都会分配到一个 IP 地址.这个地址分为两部分,前一部分代表网络,后一部分代表主机.比如, 我的 IP 地址192.168.11.95,这是一个32位的地址,我的网络部分是前面24位192.168.11,那么主机号就是后8位.处于同一个局域网的电脑,它们 IP 地址的网络部分必定是相通的,也就是说192.168.11.95与192.168.11.49处于同一个局域网.

    但是我们单纯从 IP 地址是无法判断网络部分的,我为什么知道我的 IP 地址的网络号?其实没有另外一个地址的话我也不知道的.

    那么怎样从 IP 地址来判断计算机是否处于同一个局域网呢?这就是另外一个地址的作用了,也就是子网掩码.

    所谓子网掩码,就是表示子网络特征的一个参数.它在形式上等同于 IP 地址,也是一个32位二进制数字,它的网络部分全为1,主机部分全部为0.比如我的 IP192.168.11.95,因为我的网络部分为前24位,那么我的子网掩码就是255.255.255.0.

    知道了子网掩码,就可以判断,任意两个 IP 地址是否处于同一个局域网.方法是将两个 IP 地址与子网掩码分别进行 AND 运算(两个数位都为1,则为1,否则为0),然后比较结果是或否相同,如果相同,就表明处在同一个局域网,否则就不是,就需要通过路由协议发送数据包.

    IP 协议的作用主要有两个:一个是为每一台计算机分配 IP 地址,另一个是和子网掩码结合确定元 IP 与目标 IP 是否处于同一个局域网.

    3 IP 数据包

    根据 IP 协议发送的数据,叫做 IP 数据包,不难想象,其中必定包括 IP 地址信息.

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

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

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

    报头部分主要包括版本,长度, IP 地址等信息,数据部分则是 IP 数据包的具体内容.它放进以太网数据包后,以太网数据包就拥有了两个报头.

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

    4 ARP 协议

    从数据链路层和网络层我们知道,想要发送一个数据包,必须知道两个地址,一个是对方的 MAC 地址,另一个是对方的 IP 地址.通常情况下,对方的 IP 地址是已知的,但是不知道对方的 MAC 地址.

    所以需要一种机制能够从 IP 地址得到 MAC 地址.

    这里可以分为两种情况:第一种情况,如果两台主机不在同一个局域网,那么事实上没办法得到对方的 MAC 地址,只能把数据包传送到两个局域网连接处的网关' gateway',让网关去处理.

    第二种情况,如果两台主机在同一个局域网,那么可以使用 ARP 协议,得到对方的 MAC 地址. ARP 协议也是发送一个数据包(包含在以太网数据包中),其中包含它索要查询主机的IP 地址,在对方 MAC 地址这个位置,填的是 FF:FF:FF:FF:FF:FF,表示这是一个广播地址.它所在局域网的每一台计算机都会收到这个数据包,从中取出IP地址,与自身的IP地址进行比较。如果两者相同,都做出回复,向对方报告自己的MAC地址,否则就丢弃这个包。

    总之,有了ARP协议之后,我们就可以得到同一个子网络内的主机MAC地址,可以把数据包发送到任意一台主机之上了。

    四 传输层

    1 传输层的由来

    有了MAC地址和IP地址,我们已经可以在互联网上任意两台主机上建立通信。

    接下来的问题是,同一台主机上有许多程序都需要用到网络,比如,你一边浏览网页,一边与朋友在线聊天。当一个数据包从互联网上发来的时候,你怎么知道,它是表示网页的内容,还是表示在线聊天的内容?

    也就是说,我们还需要一个参数,表示这个数据包到底供哪个程序(进程)使用。这个参数就叫做"端口"(port),它其实是每一个使用网卡的程序的编号。每个数据包都发到主机的特定端口,所以不同的程序就能取到自己所需要的数据。

    "端口"是0到65535之间的一个整数,正好16个二进制位。0到1023的端口被系统占用,用户只能选用大于1023的端口。不管是浏览网页还是在线聊天,应用程序会随机选用一个端口,然后与服务器的相应端口联系。

    "传输层"的功能,就是建立"端口到端口"的通信。相比之下,"网络层"的功能是建立"主机到主机"的通信。只要确定主机和端口,我们就能实现程序之间的交流。因此,Unix系统就把主机+端口,叫做"套接字"(socket)。有了它,就可以进行网络应用程序开发了。

    2 UDP 协议

    现在,我们必须在数据包中加入端口信息,这就需要新的协议。最简单的实现叫做UDP协议,它的格式几乎就是在数据前面,加上端口号。

    UDP数据包,也是由"报头"和"数据"两部分组成。

    "报头"部分主要定义了发出端口和接收端口,"数据"部分就是具体的内容。然后,把整个UDP数据包放入IP数据包的"数据"部分,而前面说过,IP数据包又是放在以太网数据包之中的,所以整个以太网数据包现在变成了下面这样:

    3 TCP 协议

    UDP协议的优点是比较简单,容易实现,但是缺点是可靠性较差,一旦数据包发出,无法知道对方是否收到。

    为了解决这个问题,提高网络可靠性,TCP协议就诞生了。这个协议非常复杂,但可以近似认为,它就是有确认机制的UDP协议,每发出一个数据包都要求确认。如果有一个数据包遗失,就收不到确认,发出方就知道有必要重发这个数据包了。

    因此,TCP协议能够确保数据不会遗失。它的缺点是过程复杂、实现困难、消耗较多的资源。

    TCP数据包和UDP数据包一样,都是内嵌在IP数据包的"数据"部分。TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。

    五 应用层

    应用程序收到"传输层"的数据,接下来就要进行解读。由于互联网是开放架构,数据来源五花八门,必须事先规定好格式,否则根本无法解读。

    "应用层"的作用,就是规定应用程序的数据格式。

    举例来说,TCP协议可以为各种各样的程序传递数据,比如Email、WWW、FTP等等。那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了"应用层"。

    这是最高的一层,直接面对用户。它的数据就放在TCP数据包的"数据"部分。因此,现在的以太网的数据包就变成下面这样。

    至此,整个互联网的五层结构,自下而上全部讲完了。这是从系统的角度,解释互联网是如何构成的.

  • 相关阅读:
    LintCode "Maximum Gap"
    LintCode "Wood Cut"
    LintCode "Expression Evaluation"
    LintCode "Find Peak Element II"
    LintCode "Remove Node in Binary Search Tree"
    LintCode "Delete Digits"
    LintCode "Binary Representation"
    LeetCode "Game of Life"
    LintCode "Coins in a Line"
    LintCode "Word Break"
  • 原文地址:https://www.cnblogs.com/zuanzuan/p/9919731.html
Copyright © 2011-2022 走看看