网络编程--TCP/IP协议(一)

目录

  • 前言
  • 一丶网络基础
    • <1>认识IP地址
      • 1>具体格式
      • 2>组成
      • 3>分类
      • 4>子网掩码
    • <2>认识MAC地址
  • 二丶网络设备及相关技术
    • <1>物理层--集线器
    • <2>数据链路层--交换机
    • <3>传输层--主机(操作系统)
    • <4>主机&路由器--ARP寻址+ARP缓存表
    • <5>网络层--路由器+NAPT
      • 网关
      • 规划路线
      • 总结
    • <6>冲突域和广播域
      • 冲突域
      • 广播域
  • 三丶网络数据传输流程
    • <1>局域网传输流程(同网段):集线器
    • <2>局域网传输流程(同网段):交换机
    • <3>局域网传输流程(不同网段):交换机+路由器
    • <4>广域网数据传输流程
  • 四丶总结

前言

这一部分涉及到的知识点就很多了,而且一篇博客也写不完,抓紧时间吧。

一丶网络基础

<1>认识IP地址

我们在上篇博客简略的介绍了IP地址,说IP地址是用来标识一个主机的地址,并且大致介绍了IP的格式,这里再拓展一下其他的知识。

1>具体格式

IP地址由4个数字组成,每一个数字都是一个八位的二进制数,也就是说IP地址是一个32位的二进制数。

举个“栗子”:比如说一个32位的二进制数是01100100.00000100.00000101.00000110
但是我们一般是用“点分十进制”的方式来表示,即就是:100.4.5.6

2>组成

每一个IP地址都是由网络号和主机号组成。

网络号:标识网段,保证相互连接的两个网段具有不同的表示。
主机号:标识主机,保证同一网段内,主机之间有相同的网络号,但是必须主机号不同

所以如何合理的设置网络号和主机号,就是个问题,我们要保证在相互连接的网络中,每台主机的IP都是唯一的,

3>分类

根据以前提出过的一种网络号和主机号的方案,把所有的IP地址大致划分为五类,如下图所示。

网络编程--TCP/IP协议(一)_第1张图片

注意一下,这里A~E类的IP地址划分中,网络号和主机号说的是范围。
对于这五种划分,我们大致知道就好了,不需要具体深究。这里还要提一下一些比较特殊的IP

1.将IP地址中的主机地址全部设为0,就成为了网络号,代表这个局域网;
2.将IP地址中的主机地址全部设为1,就成为了广播地址,用于给同一个链路中相互连接的所有
主机发送数据包;
3.127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1
注:本机环回主要用于本机到本机的网络通信(系统内部为了性能,不会走网络的方式传输),
对于开发网络通信的程序(即网络编程)而言,常见的开发方式都是本机到本机的网络通
信。

4>子网掩码

上述的IP划分其实是有问题的,我们单位一般都会申请B类网络,因为C类网络连接主机是很有限的。所以这个时候就会出现一个问题,B类网路主机连接最大数是65534,我们实际开发中连接的主机数量是远远的小于这个数字的。所以就会造成IP地址的浪费,A类网络就更不用说了,浪费的更严重。

为了解决这个问题,就引入了子码掩网来进行子网划分。

格 式 \color{red}{格式}

子网掩码格式和IP地址一样,也是一个32位的二进制数,左边是网络位,用二进制数字“1”表示,1的数目就是网络位的长度;右边是主机位,用二进制数字“0”表示,0的数目表示主机位的长度。
或者说子网掩码也可以用二进制所有高位1相加的数值来表示。

作 用 \color{red}{作用}

1.划分子网:举个例子,一个B类IP地址,191.100.0.0,按照A~E类分类来说,网络号二进制为16位的网络位+16位的主机号。这个时候如果我们使用子网掩码 255.255.128.0(就是17)来划分的时候,意味着划分子网之后,高17位都是网络位,也就是划分成:网络号16位+子网号1位+主机号15位。

这个时候IP地址的组成就是网络号+子网号+主机号,网络号和子网号统一为网络标识。

2.网络通信的时候,IP地址+子网掩码,就可以计算得到网络号(划分子网后的网络号)以及主机号(划分子网后的主机号)。一般可以用来判断目的IP和本机IP是否是同一个网段。

这里的网段顾名思义,就是指网络段相同的地址。

计 算 方 式 \color{red}{计算方式}

这里的计算方式是将IP地址和子网掩码进行按位与操作,得到的结果就是网络号,如果把子网二进制按位取反,再与IP地址进行按位与计算,就可以得到主机号。

<2>认识MAC地址

什么是MAC地址呢?MAC地址全称是Media Access Control。网络通信本质是网络硬件设备来传输数据,硬件会传输数据到下一个硬件,而下一个硬件的地址就是MAC,那MAC作用是什么呢?就是会用来标识网络设备的硬件物理地址。

这里在引申出下面的内容之前,先引申一个知识点–网卡,什么是网卡?

网卡,即网络接口卡(network interface card),网卡作为TCP/IP层的接口,可以在物理层传输信号,在网络层传输数据包。无论位于哪个层,它都充当计算机或服务器和数据网络之间的中间媒介。当用户发送一个web页面请求时,网卡从用户设备中获取数据,并将其发送到网络服务器,然后接收所需的数据展示给用户。(这里一般都是指的路由器)

对网卡的相关概念有了之后,我们继续往下说

1.主机具有一个或多个网卡,路由器具有两个或两个以上网卡;其中每个网卡都有唯一的一个MAC地址。这里主机虽然有一个或者多个网卡,但是大多数情况只使用一个网卡。一个网卡有全球唯一的MAC地址(网卡出厂就设置好了)
2.网络通信,即网络数据传输,本质上是网络硬件设备,将数据发送到网卡上,或从网卡接收数据。
3.硬件层面,只能基于MAC地址识别网络设备的网络物理地址。

先看下图
网络编程--TCP/IP协议(一)_第2张图片

可以看到,我们的网络数据传输,不是直接从源主机B到目的主机C,而是中间一站一站的被传输到主机C的。对于经过的网络设备

主机:配有IP地址,但是不进行路由控制的设备;
路由器:即配有IP地址,又能进行路由控制;
节点:主机和路由器的统称;

所以对于IP地址和MAC地址。

整个路途的起点叫做源IP,终点就做目的IP。是给人使用的网络逻辑地址。
每一站的起点叫做源MAC,每一站的终点叫做目的MAC。是给网络硬件设备使用的网络物理地址。

二丶网络设备及相关技术

在这里讲解之前,要对一个概念进行拓展。我们之前说过,端口是标识主机当中接收数据和发送数据的进程。但是这里要说明一下,端口分为是分为逻辑端口和物理端口的,我们之前说的是逻辑端口,这里两者一起来综合讲一下。

物理端口:硬件设备如集线器(物理层),交换机(网络层)路由器(传输层)等拥有的物理端口。
逻辑端口:进程绑定的端口,是属于操作系统虚拟的一个0~65535范围内的数字。

<1>物理层–集线器

集线器是工作在物理层的网络设备。发送到集线器的任何数据,集线器都会把这个数据复制并且转发到其他所有的端口。(这里指的是集线器后边的物理端口)

<2>数据链路层–交换机

所谓交换机,就是工作在数据链路层的一种设备,交换机内部会记录并且维护一张MAC地址转换表。每一台主机和交换机相连的时候,交换机就记录主机的MAC地址和连接的端口。

1.MAC地址转换表主要记录MAC地址与端口之间的映射(端口指的是交换机后边的
物理端口)
2.主机连接到主机,以及主机发送数据的时候,交换机可以学习并且记录该主机
的MAC地址与端口信息。
3.交换机接收到数据报之后,在MAC地址转换表中,通过目的MAC找到对应的端口
,则目的主机为该端口连接的主机。只需要将数据报转发到对应端口上即可。

讲到这里其实是有一个问题的,就是上述是能通过目的MAC找到对应端口的情况。如果找不到呢?换种说法,我们都知道主机是从上到下一层层封装数据报的,如果封装到数据链路层不知道目的MAC要怎么办呢?

这个时候是知道目的IP的(网络层IP协议数据包中包含目的IP和地址和源IP地址),交换机就会设置数据报目的MAC为广播地址址FF:FF:FF:FF:FF:FF,发送到其他所有的端口,目的主机返回响应之后,交换机再记录该主机MAC与端口的映射信息。这种方式类似广播喊话,xxx,你听到了就应我一声。

<3>传输层–主机(操作系统)

这里按照内容的排序来说,本来应该是说网络层的路由器的,但是路由器当中很多的概念需要提前引申一下,所以这里我就把网络层这一部分放到了后面。所以先说主机这部分。

主机的作用主要是按照网络分层从上到下对数据报进行封装。
网络编程--TCP/IP协议(一)_第3张图片

这个我们之前都是已经说过的了,这里继续拓展。
我们在发送数据的时候,首先要判断是否是同一个网段(这里再次提一下,IP地址组成为网络号和主机号,而网段就是网络段相同的地址),根据是否是不同的网段,发送方式就不同。
一步一步来,首先我们如何判断发送端主机(源主机)和接收端主机(目的主机)是否是同一个网段呢?

如果源主机的网络号=目的主机的网络号就是同一个网段,不然的话就不是。(PS:前面子网部分提到过,子网掩码+源IP可以推导源主机的网络号,子网掩码+目的IP可以推导出来目的主机的网络号,这也是判断是否是同一个网段的一种手段)

那么接下来分情况讨论

1.如果是同一网段:整个一跳一跳的过程,就只有一跳。(源主机–>目的主机)

2.如果是不同网段:这个时候如果源主机知道目的IP,但是不知道目的MAC,那么隔空喊话就没用了,这个时候就会发送到网关设备(要知道网关设备的IP,并且要知道网关设备的MAC(不知道就是同段喊话))。

是不是有点乱?那么看下面这个图
网络编程--TCP/IP协议(一)_第4张图片

这里如果我们不知道目的MAC就要先发到网关设备,相当于提前先跳一次,由源主机跳到网关设备(一般都是路由器),然后再从路由器跳到下个设备。

<4>主机&路由器–ARP寻址+ARP缓存表

首先,什么是ARP?

ARP是一个介于数据链路层和物理层之间的协议,ARP协议建立了IP地址和MAC地址的映射关系。

那么继续,什么是ARP寻址?

在数据链路层,寻找下一跳设备MAC地址的过程,就叫做ARP寻址。
(1)主机和路由器都保存了一张ARP缓存表,通过IP地址可以找到对应的MAC地址。
(2)根据下一跳设备的IP地址,在ARP缓存表中能找到对应的MAC地址,然后就可以设置目的MAC并且发送数据报。
(3)如果找不到,就要发送ARP广播数据报,目的MAC为广播地址,询问下一跳的设备的MAC地址。

<5>网络层–路由器+NAPT

路由器有两个作用

网关

网关:路由器作为网关,可以划分公网和局域网,甚至某些路由器还可以把局域网划分为多个子网(不同网段)。
注:这里的公网端口就是WAN口,为单独的网卡,具有公网IP地址和公网MAC地址。划分的多个子网,是由局域网端口即LAN口划分,每个端口都有单独的网卡,具有该网段IP地址和MAC地址。每一个路由器都可以找到自己局域网内的的任意主机,并且记录ip以及mac的映射关系(路由器ARP缓存表)

当源主机发送数据到目的主机,如果说源主机和目的主机在同一个局域网中,我们就可以通过ARP缓存表,去找寻对应的目的主机。

如果不在一个局域网中,这个时候可能路由器也不知道目的IP的主机是哪里,这时候发送的数据报

1)源IP       (2)源port

就会通过NAPT技术,把我们源主机的IP和port转换为路由器公网的ip/port。

规划路线

这个大致提一下,知道有这么个功能就好了
所谓路由,即在复杂的网络结构中,找出一条通往终点的路线;
网络通信(网络数据传输),路由器中的路由功能,就类似于规划路线,往哪个方向行进能更快到达目的地。

总结

所以整体来看路由器的功能可以总结出一下几点

1)划分子网(一个局域网,多个不同的网段)
(2)ARP缓存表:记录路由器所在的局域网所有主机的IP和MAC(能找到局域网内所有主机)
(3)具有WAN口:绑定公网IP,如果目的主机不在局域网内,就需要使用NAPT协议,把源主机
和port转换为路由器公网的IP和port
(4)路由功能:如果目的IP是公网主机,能通过路由功能,计算出哪个方向更近

<6>冲突域和广播域

冲突域

冲突域指的是同一时间,多台主机同时发送数据,如果产生冲突,这个范围就是冲突域,冲突域基于第一层物理层,所以也叫碰撞域

集线器:所有的端口构成一个冲突域
交换机:一个端口构成一个冲突域

广播域

广播域是指某个网络中的主机同时向网络中其他所有主机发送数据,这个数据能传播到的范围就叫做广播域。广播域基于第二层数据链路层。

集线器:所有端口处于一个广播域
交换机:所有端口处于一个广播域
路由器:lan口(不同网段),隔离广播域

三丶网络数据传输流程

组网的方式有很多很多种,笔者初学,所以这里就说几种最最基础的几种。

<1>局域网传输流程(同网段):集线器

如果说是用集线器网络互连,就是在一个集线器上面挂几台主机。

在发送端主机发送数据包的时候,需要从上往下的封装数据包。但是封装的时候,封装到数据链路层发现目的MAC可能还不知道
在这里插入图片描述

所以要先进入ARP寻址,主机和路由器都保存了一张ARP缓存表

(1)发送端在本机ARP缓存表中,根据目的IP查找对应的MAC地址
(2)如果找到,则可以在数据链路层以太网帧头中,设置目的MAC并发送数据包
(3)如果没有找到,需要先发送ARP广播数据报(把目的MAC设置为FF:FF:FF:FF:FF:FF,然后喊话所有的主机,你们谁的IP地址是xxx,把你的MAC地址给我),让接收端,即目的主机告诉自己,目的MAC是多少
(4)发送端更新本机ARP缓存表:保存目的IP与目的MAC的映射
(5)有了目的MAC,就可以按照第(2)个步骤发送数据了。

<2>局域网传输流程(同网段):交换机

这里是用交换机进行网络互连,也就是一个交换机上面挂几台主机。
还是老规矩,主机从上到下进行对数据进行封装。
在这里插入图片描述
到数据链路层的时候,如果说能从本机的ARP缓存表中,通过目的IP可以找到对应的MAC地址,那就直接设置到目的MAC就好。如果找不到,那就把目的MAC设置为FF:FF:FF:FF:FF:FF,然后进行喊话,拿到对应的MAC。然后发送到交换机当中。
上面我们也说了,交换机维护了一张MAC地址和端口的映射表,接着交换机就会根据映射关系把这个数据发送到对应的端口。
这个时候有个问题嗷,就是此刻交换机检测到目的MAC为FF:FF:FF:FF:FF:FF,那就把这个把数据包发送到所有的接收端主机,让接收端主机来自己对照,谁的IP地址和这个数据包中记录的一样的?把你的端口号和MAC地址返回给我。通过这种方式拿到端口之后,记录对应的MAC地址和端口之间的映射关系。也就是说本机会喊话,交换机也会喊话!

<3>局域网传输流程(不同网段):交换机+路由器

这里是用交换机+路由器来进行对应的网络连接。

这里的封装流程和前面一样
在这里插入图片描述
但是封装到了这里之后,要进行一个判断,就是目的主机和源主机是否是一个网段内的。

(1)通过目的IP和本机IP分别于本机子网掩码进行按位与运算,得到对应主机的网络号,也就是网段。
(2)如果一样,就是同一网段,那接下里的流程和上面的两种方式就是一样的。
(3)如果不一样,那本机是无法处理不同网段的要求的。这个时候就要让我们的网关–路由器来处理。

那接下来操作如下:

(1)找到对应的网关IP,也就是与本机相连的路由器的IP
(2)然后根据ARP寻址,根据网关IP找到对应的端口,把目的端口改成网关端口

把数据对应的部分改了之后,就把这个数据发送到交换机(类似下面这个格式)
网络编程--TCP/IP协议(一)_第5张图片
然后交换机里面不是有记录了MAC和端口映射关系的MAC地址转换表,根据目的MAC,找对应的网关设备,并且发送数据。这个时候数据就来到了我们的路由器当中。
路由器会把这个数据从下到上进行解析。拿到目的主机的IP,再根据ARP寻址找到对应的MAC地址。把内容进行更改
在这里插入图片描述
接着把这个数据报封装,并且发送到目的主机当中。目的主机接收到了之后,解析数据报

数据链路层:目的MAC和我一样,接收
网络层:目的IP和我一样,要处理
传输层:根据端口找对应的进程
应用层:把数据交给应用层,由应用程序根据应用层协议解析

至于返回响应,就是把目的IP和源IP对换,目的端口和源端口对换之后,再把这个流程再走一遍。

<4>广域网数据传输流程

在广域网当中传输数据相对于上面来说是有点特殊的。为什么特殊呢?因为这个时候你的目的IP不在路由器的范围之内,这意味着什么?意味你的目的IP在哪里路由器也不知道。那这个时候就是我们的路由器WAN功能起作用的时候了,
我们的路由器绑定了一个公网IP,可以通过NAPT协议,把源主机IP和port(端口)转换为公网的IP和port(端口)。然后通过路由功能去计算出那条路径离目的主机最近,再接着去发送我们的数据包。总体流程来口述一遍吧!
老规矩,先从源主机封装数据开始
在这里插入图片描述
在这里封装到数据链路层之后,就要用子网掩码和目的IP以及源IP进行按位与计算,拿到对应的网络号,如果网络号相同,那就是在同一网段内,这个没啥说的,流程就是我们上面的同一网段内的局域网传输流程。这里说一下不同网段并且不同局域网的。
如果网络号不同,那么就准备要把这个数据交给网关,也就是路由器去处理。
这个分两种情况:
<1>如果说中间相连的设备是交换机,那就是下面这个场景

1.找到与本机相连的网关IP,也就是路由器的IP
2.根据ARP缓存表的映射关系,通过路由器的IP找到对应的MAC地址

然后把数据报文的目的MAC改为路由器的MAC之后,把这个数据包发送给交换机。交换机里面有MAC地址转化表,它会根据数据的目的MAC地址,把这个数据发送给与对应端口相连的物理设备,即就是把这个数据包发给路由器。

<2>如果说中间相连的设备是集线器

那集线器就会把这个数据报发给相连的所有端口,其中当然也包括我们的目的网关–路由器。

路由器收到这个数据报之后,就会把这个数据包从下到上解析。

1.解析之后,会根据NAPT协议把源IP和源端口转换为路由器公网IP和路由器公网端口。
2.转换完成之后,根据路由技术,通过路由表计算路线,获取正确方向的下一个设备IP。接着会把源MAC改为当前路由器的MAC

这里提一下,这里的转化部分是三个,但是转换的步骤是基于路由器的对应两个功能实现,之后的数据包里面携带的信息应该是这样子的

修改内容为:
源IP:路由器的公网IP 
源端口:路由器的公网端口
源MAC:路由器的MAC 
目的MAC:下一个设备的MAC

找到正确方向的下一个设备的IP之后,就会把这个数据包发给对应的设备,也就是下一个路由器,下一个路由器会先解析,再把源MAC改为自己的MAC,目的MAC改为下一跳设备的MAC。转换之后再基于路由功能转发到之后设备。然后继续重复,直到找到对应的路由器为止。(这里的源IP和源端口不变)
此时的数据报如下(这里的源MAC和目的MAC就没必要写了):
网络编程--TCP/IP协议(一)_第6张图片

最终达到目的主机后,目的主机会从下到上进行分用(解析)
在这里插入图片描述

tomcat处理请求之后,会把这个响应封装成一个数据包,其中源IP和目的port,目的IP和目的port与请求的数据包恰好相反。封装好之后,把这个请求按照这一部分的流程再走一遍,回到最初的主机就是一个完整的流程。

四丶总结

这一部分知识点真的挺多的,需要自己去整理总结,好好加油!

你可能感兴趣的:(网络编程,tcp/ip,网络编程)