zoukankan      html  css  js  c++  java
  • 计算机网络基础

    这里写图片描述

    一.物理层

      物理层定义了网口RJ45的尺寸大小,网线上电压的模式等。那些在网线中传播的二进制数据流是这层的具体表象。也就是说,这一层上面没有什么协议,就算有,也就曼切斯特编码算协议。我们把两台机器用网线连起来,或者用集线器(HUB)把机器都连起来,这些工作就是物理层的工作。
      有2个设备属于物理层的,一个是中继器,一个是HUB。大家知道,物理上面的连线距离一长就会产生电信号的衰减。为了重新加强这个信号,我们就需要在一定距离之后加上一个信号放大器,这就是中继器(Repeater)。
      1. Repeater连接在两根网线之间,对信号没有做任何处理。
      2. HUB的本质其实是一个多口中继器(Multi-port Repeater),是连接多根网线的一个物理设备。
      既然物理层传输的是电信号。那么如果我有两台机器一起发电信号,信号岂不是混乱了么?
      非常正确。这个问题在网络里面成为”碰撞”,所以协议里面规定了如果你需要往外发数据,一定需要先看看电缆里面有没有别的信号。如果没有,那就可以发。如果两者同时发送,检测到碰撞之后,两者分别等待一个随机时间,然后重发。这个就是重要的”碰撞检测”。
      如果连接在网络上的计算机越来越多,那么碰撞的现象会越来越频繁。这样效率一定很低了。恩,这里还有一个重要概念”冲突域”。在同一个物理上连接的网络上的所有设备是属于同一个冲突域的。所以用Repeater或HUB连接的设备是在一个冲突域上的。
      接着就需要引入我们的二层设备来分割冲突域了。

    二.数据链路层

      这个层面上面的东西不再是电信号了,而是DATA了。既然是DATA就有逻辑关系了。这个层面上面的基本单位是帧(Frame)。他是把从网线上面传输的电流转换成0和1的组合。
      物理层只是网卡对网线发出或者接受各种电平信号,那就是说物理层是无法判别电流的来源和目标的。那么把电流打成0和1的帧之后,里面就有逻辑数据了。有了数据,就可以判别数据从何而来,到何处去。所以也就可以真正的形成LINK,二层设备有两个:
      1. 网桥(Bridge)就是连接2个不同的物理网络的。主要功能是在2个网络之间转发Frame。因为从实际中我们可以知道,其实很多时候并非整个网络都在相互通讯。最多相互通讯的一组计算机我们可以分在一个小的冲突域内。这样分割以后可以减少冲突。由于网桥两边的通讯不是非常频繁,所以使用网桥来为两边作”代言人”。
      2. 交换机(Switch),其本质是一个多口网桥(Multi-port Bridge)。交换机的每个口后面都是一个冲突域。交换机比HUB快,就是因为交换机分割了所有的冲突域。交换机的主要功能就是“存储转发”,根据帧的MAC地址,决定这一帧从哪个端口出去。
    网桥连接模式(红点处为HUB):
    这里写图片描述

    交换机连接模式:
    这里写图片描述
      从图中可以看到,网桥只有2个输入/出端口,而交换机有8个。嗯,是的,一开始的时候(那时候只有HUB这种设备),由于硬件水平不是很发达,人们为了提高局域网效率,减少广播风暴的出现,他们生产了网桥(一个只有两个输入/出端口的链路层设备,这时的网桥已经是个比较先进的设备),然后他们把一个局域网一分为2,中间用网桥连接,这样A发给BCD的数据就不会再广播到EFGH了(网桥发现如果数据包不是转发给下面这个子网的,它会自动丢弃此包),只有从A发到EFGH的数据包才能通过网桥,到达另外一个子网(网桥发现如果数据包是转发给下面这个子网的,它才会把包转发给这个子网)。
      这样一来,非必要的传输减少了,整个网络的效率也随之提高可不少!人们发现网桥真是个好东西呀,随着硬件发展,出现了4个,8个端口的链路层设备,这就是交换机,由于交换机可以使得网络更安全,网络效率更高,交换机渐渐替代了HUB,成为组建局域网的重要设备。
      以太网是目前应用最广泛的局域网,其他局域网类似ATM,都已经慢慢消失了。以太网主要描述二层结构。以太网的帧结构如下:
    这里写图片描述
      1.以太网的前导字段和SFD是0xAAAAAAAAAAAAAAAB(8Byte,时序在前——时序在后),其中SFD是0xAB(10101011),其中的11区别于前导字段,表明这是帧定界符,后面的就是数据部分了。
      2. DA/SA指的都是MAC地址,6Byte。
      如果MAC地址中第一个字节的最低有效位为1,则该地址是组播目标地址。例如,01-00-00-00-F0-00。带有组播目标地址的数据包将被送达一组选定的以太网节点。
      如果目标地址字段是保留的组播地址FF-FF-FF-FF-FF-FF,则该数据包是广播数据包,它将被发送给共享该网络的每一个节点。
      如果MAC地址中第一个字节的最低有效位为0,则该地址是单播地址,数据包将仅供具有该地址的节点使用。
      这里要注意这三种播在IP地址和MAC地址中的不同。
      3.类型/长度字段定义后面的数据包属于何种协议,如果该字段小于等于0x05DCh(1500),说明该字段是长度字段。如果我们使用IP或者ARP协议的话,这个字段就是类型字段:IP(0x0800),ARP(0x0806)。
      4.数据和填充这两部分最小是46Byte,最大是1500Byte,如果数据部分小于46Byte,那么就需要使用填充部分去填满0x00,使得这两部分是46Byte。这部分放上层的信息,比如IP包就在以太帧的数据段中。
      5.最后这部分是CRC校验码。
      

    三.网络层

      这一层的基本单元是包(Packet)。所有的包都有一个IP头,IP就是用来在这层上面标识Packet的来源和目的地址的。
      这层的一个主要概念就是”路由”,也就是和交换机一样,把包转发到其他的地方。不过有个不同的地方,交换机只有知道具体的MAC在哪里的情况下才能够发送给指定的计算机,而路由则不需要知道最终IP所在的计算机在哪个位置,只要知道那个途径可以过去就可以工作。
      IP地址本质上是终点地址,它在跳过路由器(hop)的时候不会改变,而MAC地址则是下一跳的地址,每跳过一次路由器都会改变。
      IP地址在三层,MAC地址在二层。当信息还在二层,还未去三层解包的时候,IP地址其实只是二层中的数据部分。
    这里写图片描述
      1.版本号(Version):4bit。标识目前采用的IP协议的版本号。一般的值为0100(IPv4),0110(IPv6)
      2. IP包头长度(Header Length):4bit。这个字段的作用是为了描述IP包头的长度。单位为32bit(4个字节),一个IP包头的长度最长为“1111”,即15*4=60个字节。IP包头最小长度为20字节。
      3.服务类型(Type of Service):1Byte。按位被如下定义:PPP DTRC0
    PPP:定义包的优先级,取值越大数据越重要。
    000 普通 (Routine)
    001 优先的 (Priority)
    010 立即的发送 (Immediate)
    011 闪电式的 (Flash)
    100 比闪电还闪电式的 (Flash Override)
    101 CRI/TIC/ECP(找不到这个词的翻译)
    110 网间控制 (Internetwork Control)
    111 网络控制 (Network Control)
    D 时延: 0:普通 1:延迟尽量小
    T 吞吐量: 0:普通 1:流量尽量大
    R 可靠性: 0:普通 1:可靠性尽量大
    M 传输成本: 0:普通 1:成本尽量小
    0 最后一位被保留,恒定为0
      4. IP包总长(Total Length):2Byte。以字节为单位计算的IP包的长度 (包括头部和数据),所以IP包最大长度65535字节。
      5.标识符(Identifier):2Byte。该字段和Flags、Fragment Offest字段联合使用,对较大的上层数据包进行分段(fragment)操作。路由器将一个包拆分后,所有拆分开的小包被标记相同的值,以便目的端设备能够区分哪个包属于被拆分开的包的一部分。
      6.标记(Flags):3bit。该字段第一位不使用。第二位是DF(Don’t Fragment)位,DF位设为1时表明路由器不能对该上层数据包分段。如果一个上层数据包无法在不分段的情况下进行转发,则路由器会丢弃该上层数据包并返回一个错误信息。第三位是MF(More Fragments)位,当路由器对一个上层数据包分段,则路由器会在除了最后一个分段的IP包的包头中将MF位设为1。
      7.片偏移(Fragment Offset):13bit。表示该IP包在该组分片包中位置,接收端靠此来组装还原IP包。
      8.生存时间(TTL):1Byte。当IP包进行传送时,先会对该字段赋予某个特定的值。当IP包经过每一个沿途的路由器的时候,每个沿途的路由器会将IP包的TTL值减少1。如果TTL减少为0,则该IP包会被丢弃。这个字段可以防止由于路由环路而导致IP包在网络中不停被转发。
      9.协议(Protocol):1Byte。标识了上层所使用的协议。
    以下是比较常用的协议号:
    1   ICMP
    2   IGMP
    6   TCP
    17  UDP
    88  IGRP
    89  OSPF
      10.头部校验(Header Checksum):2Byte。用来做IP头部的正确性检测,不包含数据部分。路由器会为每个通过的数据包重新计算这个值因为每个路由器要改变TTL的值。
      11.起源和目标地址(Source and Destination Addresses):这两个字段都是4Byte。标识了这个IP包的起源和目标地址。要注意除非使用NAT,否则整个传输的过程中,这两个地址不会改变。
      至此,IP包头基本的20字节已介绍完毕,此后部分属于可选项,不是必须的部分。
      12.可选项(Options):这是一个可变长的字段。该字段属于可选项,主要用于测试,由起源设备根据需要改写。可选项目包含以下内容:
      松散源路由(Loose source routing):给出一连串路由器接口的IP地址。IP包必须沿着这些IP地址传送,但是允许在相继的两个IP地址之间跳过多个路由器。
      严格源路由(Strict source routing):给出一连串路由器接口的IP地址。IP包必须沿着这些IP地址传送,如果下一跳不在IP地址表中则表示发生错误。
      路由记录(Record route):当IP包离开每个路由器的时候记录路由器的出站接口的IP地址。
      时间戳(Timestamps):当IP包离开每个路由器的时候记录时间。
      填充(Padding):因为IP包头长度(Header Length)部分的单位为32bit,所以IP包头的长度必须为32bit的整数倍。因此,在可选项后面,IP协议会填充若干个0,以达到32bit的整数倍。

    四.传输层

      TCP/IP代表的是一个协议族,由于这些协议中数TCP协议和IP协议最出名,就用这两种协议代表这一族协议。这里以TCP为例,下图是TCP帧结构:
    这里写图片描述
      TCP连接示意图:
    这里写图片描述
      三次握手步骤:
      1. A 的 TCP 向 B 发出连接请求报文段,其首部中的同步位SYN=1,并选择序号seq=x,表明传送数据时的第一个数据字节的序号是x
      2. B 的 TCP 收到连接请求报文段后,如同意,则发回确认(B在确认报文段中应使SYN=1,使 ACK=1,其确认号ack=x+1,自己选择的序号seq = y)
      3. A 收到此报文段后向 B 给出确认,其 ACK=1,确认号ack=y+1(A的 TCP通知上层应用进程,连接已经建立,B的TCP收到主机A的确认后,也通知其上层应用进程:TCP连接已经建立)
      TCP释放示意图:
    这里写图片描述
      三次握手步骤:
      1.数据传输结束后,通信的双方都可释放连接。现在A的应用进程先向其 TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接(A把连接释放报文段首部的FIN=1,其序号seq=u,等待B的确认)
      2. B发出确认,确认号ack=u+1,而这个报文段自己的序号seq=v(TCP 服务器进程通知高层应用进程。从A到B这个方向的连接就释放了,TCP连接处于半关闭状态。B若发送数据,A仍要接收)
      3.若B已经没有要向A发送的数据,其应用进程就通知TCP释放连接
      4. A收到连接释放报文段后,必须发出确认,在确认报文段中ACK=1,确认号ack=w+1,自己的序号seq=u+1
      下图是Wireshark抓取的TCP包,其中1-3号是TCP连接,156-158号是TCP释放,4-6号和7-9号分别是两次数据传输。
      其中Seq和Ack这两个序号分别代表已经发送的字节数和接收的字节数,这两个数用于收发段的滑动窗口的计算。
    这里写图片描述

    【Reference】
    百度文库
    其他博客
    (毕竟是基础知识,资料太多)

  • 相关阅读:
    Mysql数据库的安装及配置
    java调用ws服务
    linux下安装mysql
    实现离线地图行政区域划分
    linux远程方式,以及基础命令
    javascript对文件的读写
    jsoup对 HTML 文档的解析和操作
    Linux netstat命令详解
    服务器开发工具
    github基本命令
  • 原文地址:https://www.cnblogs.com/season-peng/p/6713513.html
Copyright © 2011-2022 走看看