这篇文章参考自《图解TCP/IP》,根据我个人的粗略的理解,结合书籍整理出来的,主要目的是在于整理笔记,方便复习记忆等…如果你觉得对你有所帮助,那自然最好不过.既然是初识,有些部分也不会过于详细的介绍(打算留到后边进行整理…)
1.IP地址
什么是IP地址?
在TCP/IP的通信中,IP地址用于标识主机和路由器,简单来说IP地址用来定位主机的网络地址…就好比是你寄快递的时候,寄件地址就是源IP地址,收件地址就是目的IP地址.
IP地址的表示(IPv4):
例如:192.168.43.203
IP地址是由32位正整数来表示,采用"点分十进制". 把32位分成4份,由"."分割开,然后转成十进制.
一个IP地址有32位,也就是说,可以有2^32也就是43亿个不同的IP地址,虽然看起来是很多,但是实际想一下,现在全球人数都不止43亿人了…而且现在越来越多人拥有多台主机.如果还是按照以前那样,一台主机对应一个唯一的IP地址,则很可能会出现IP地址耗尽的情况
(IP地址并非是根据主机台数来进行配置的.而是每一台主机上的每一块网卡(NIC)都得设置IP地址,通常一个网卡只设置一个IP地址,其实一块网卡可以设置多个IP地址,此外,一台路由器通常会配置两个以上的网卡…)
IP地址的组成
IP地址由网络表示(网络地址)和主机标识(主机地址)两部分表示.
不同网段内的网络地址不同,而在相同的网段内相连的主机则必须有相同的网络地址,IP地址的"主机标识"则不允许在同一网段内重复出现.
根据网络地址,找到相应的网段,然后再根据主机地址,找到目标主机.
IP包被转发到途中某个路由器时,正是利用目标IP地址的网络表示进行路由
网络标识和主机标识的划分
那么从第几位到第几位是网络地址,又从第几位到第几位是主机地址呢?
一开始是进行分类,地址分别分成A类,B类,C类,D类,E类
以下简单了解一下即可:
A类地址: 网络地址0.0.0.0~127.0.0.0(首位为0是固定的,剩余七位加起来最大为255-128),后24位为主机地址
A类地址是首位以"0"开头的地址.从1~8位是它的网络标识,剩余的24位是主机标识.一个网段内能容纳的主机上限为2^24-2,也就是1677214个.
注: 在用比特位表示主机地址的时,不能全部为0或全部为1.
一般来说,这两个是作为保留地址.全部为0在表示对应的网络地址或IP地址不可获知的情况才使用,而全为1的主机地址通常作为广播地址.所以这里-2.
B类地址: 前两位固定是"10"的地址.
网络地址(前16位)为128.0.0.0~191.255.0.0(都能推算出来…),后16位为主机地址,一个网段内能容纳的主机地址上限为2^16-2,也就是65534个.
C类地址: IP地址是前三位为"110"的地址.
网络地址为(前24位)192.0.0.0~223.255.255.0,留给主机地址只有8位.
一个网段内能容纳的主机地址上限为2^8-2,也就是254个
D类地址: 前四为是"1110"的地址.
全部都是网络地址224.0.0.0~239.255.255.255,没有主机地址
常用于多播.
注: 网络标识相同的计算机必须同属于一个链路,架构A类网络的时,理论上允许167,7214台计算机连接…B类允许6,5534个计算机连接,但是实际上并不会有那么多计算机在同一个链路上的情况.所以如果使用A类和B类,则会造成很多浪费…所以现在通常采用子网掩码划分IP地址的方式来分配IP地址.
关于广播地址:
广播地址用于在同一个链路中相互连接的主机之间发送数据包.
将IP地址中的主机地址部分全部设置成1,就成了广播地址.
广播分为两种:
1.本地广播:在本网络的广播
这种广播无法将IP包通过路由器转发到其他网络内.
2.直接广播:在不同网络之间的广播
能将IP数据包通过路由器转发到不同的网络内.
IP多播
多播用于将包发送给特定组内的主机.多用D类地址.
由于其直接使用IP协议,因此也存在不可靠传输.
多播既可以穿透路由器,又可以实现只给那些必要的组发送数据报.
通过子网掩码来划分IP地址
子网掩码是用来灵活的划分IP地址的网络地址和主机地址,而不用受限于类别.子网掩码同IP地址一样,有32位,它对于的网络标识部分的位全为"1",主机标识部分全为"0".
对于子网掩码,有两种表示方式:
一种是将IP地址和子网掩码的地址分别用两行来表示.
通过子网掩码自由的定位IP的网络表示长度,本来这个IP地址是属于B类地址,也就是网络标识只有16位,通过子网掩码扩大了10位,这样网络标识就变成26位了.
还有一种是在每个IP地址后面追加网络地址的位数,用"/"隔开
26就表示子网掩码定义的网络地址有26位.
不难看出,在第二种方式下记述网络地址时可以省略后面的“0”。 例如172.20.0.0/16跟172.20/16其实是一个意思。
有两个转换公式:
①IP地址&子网掩码 = 网络地址
②将子网掩码的二进制按位取反,再与IP地址进行位与运算,得到的就是主机号
有了子网掩码后,就大大地提高了IP地址的利用率,也相对缓解了IP地址不够用的问题.
那这样的话,具备私有IP地址的主机是如何在互联网内进行通信的呢?
如果是在同一个域内(独立网络),里面的私有IP地址各不相同,能够实现互相通信.但若是想与另一个域内的主机进行连接,就需要采取一些手段了.
现在,私有IP地址结合NAT技术已成为现在解决IP地址分配问题的主流方案.
但这种方式只能说是"借尸还魂",IP地址资源耗尽的问题还是没能完全解决.
最好的方式就是采用IPv6(128位),但目前IPv6的普及率不理想.
2.端口号
数据链路层有MAC地址,网络层有IP地址.(MAC地址用于区分同一个链路
中的不同计算机,IP地址是用来识别(标识)主机和路由器)
相应的传输层也有类似于地址的概念,那就是端口号.
端口号占两个字节,是0~65535范围的数字.
按照概念,端口号是用来识别同一台计算机中进行通讯的不同程序.也就是说,端口号可以定位主机中发送数据和接收数据的进程.(但实际上不仅限于主机…比如说上面图5.20,这里的端口号的作用可以说是在区分不同的主机,实际上还是在区分程序,只不过是不同主机上的程序罢了)
在网络通信中,进程可以通过绑定一个端口号,来发送及接收网络数据.
但一个端口号只能绑定一个进程,而一个进程可以绑定多个端口号.
(进程里面有多个socket,端口号与进程里面的socket进行绑定,socket就是文件,而一个进程里可以有多个文件.因此,一个进程能够绑定多个端口号)
对于这些端口号,实际上不一定非得严格遵守,只是说最好是这样做.就是自己写的服务器最好不去使用这些知名端口号.
数据到达IP(网络)层后,会先检查IP首部中的协议号,再传给相应协议的 模块。如果是TCP则传给TCP模块、如果是UDP则传给UDP模块去做端 口号的处理。即使是同一个端口号,由于传输协议是各自独立地进行处理,因此相互之间不会受到影响。
3.协议
就相当于寄快递:
1.寄件人地址
2.具体的寄件人
3.收件人地址
4.具体的收件人
5,使用某种方式寄(比如顺丰)
4.协议分层
就类似于Java代码,如果所需要实现的功能过于复杂,这时候就需要创建多个类,然后按照每个类的作用进行分组,放到不同包里.
关于OSI七层模型: OSI参考模型对通信中必要的功能做了很好的归纳,许多的通信协议都对应了OSI参考模型7个分层中的某层.
虽然OSI七层模型既复杂又不实用,也因此并没有落地实现,但其对学习和设计协议起到一定的引导作用.
▼ 互连的网络终端,如计算机等设备。
■ 应用层
为应用程序提供服务并规定应用程序中通信相关的细节。 包括文件传输、电子邮件、远程登录(虚拟终端)等协议。
■ 表示层
将应用处理的信息转换为适合网络传输的格式,或将来自下一层的数据转换为上层能够处理的格式。因此它主要负责数据格式的转换。
具体来说,就是将设备固有的数据格式转换为网络标准传输格式。不同设备对同一比特流解释的结果可能会不同。因此,使它们保持一致是这一层的主要作用。
■ 会话层
负责建立和断开通信连接(数据流动的逻辑通路),以及数据的分割等数据传输相关的管理。
■ 传输层
起着可靠传输的作用。只在通信双方节点上进行处理,而无需在路由器上处理。
■ 网络层
将数据传输到目标地址。目标地址可以是多个网络通过路由器连接而成的某一个地址。因此这一层主要负责寻址和路由选择。
■ 数据链路层
负责物理层面上互连的、节点之间的通信传输。 例如与1个以太网 相连的2个节点之间的通信。 将0、1序列划分为具有意义的数据帧传送给对端(数据帧的生成与 接收)。
■ 物理层
负责0、1比特流(0、1序列)与电压的高低、光的闪灭之间的互换。
假定用户A要给用户B发送一封内容为"早上好"的邮件,网络究竟会进行哪些处理呢?这里从上到下来进行分析一遍.
1. 应用层
首先是应用层,当用户输入完所需要发送的内容,并点击发送的那一刻起,就已经进入了应用层协议的处理.应用层会按照某种协议来对数据进行封装.
(每一层都会将收到的数据前端附加首部或标签信息后再转发给下一层.而这些首部或标签中记录这数据传送顺序的信息–待第5节再细说)
2. 表示层
表示层负责数据格式的转换,进行数据格式的统一.
数据开始传输的时候,表示层把"计算机特有的数据格式"转化成统一的网络标准传输格式进行传输,然后数据传输到目的地点后,传输层又会将网络标准传输格式转换成设备固有的数据格式.
保持数据的一致性,正是表示层的作用所在,即表示层是进行"统一的网络数据格式"与"某一台计算机或某一款软件特有的数据格式"之间进行转换的分层.
3. 会话层
会话层是负责采用何种连接方式,以及负责决定建立连接和断开连接的时机的分层.
负责何种连接方式.比如说,用户A准备给用户B发送5封邮件,这5封邮件的发送顺序可以有很多种.可以是每发一封就建立一次连接,发完就断开;也可以建立一次连接后,将5封邮件连续发送给对方.甚至可以一次性建立五次连接,同时发完.
4. 传输层
主机A确保与主机B之间的通信并准备发送数据,这一过程叫做"建立连接".
而传输层的作用是进行实际的建立连接和断开连接的处理,在两个主机之间创建逻辑上的通信连接.
此外,传输层还保证了可靠性,传输层为确保所传输的数据到达目的地址,会在通信两端的计算机之间进行确认,如果数据没有到达,就会进行重传.
5. 网络层
真正进行数据的传输是在网络层.
网络层的作用是在网络与网络互相连接的环境中,将数据从发送端主机发送到接收端主机.这一层主要负责寻址和路由选择.
6. 数据链路层
通信传输实际上是通过物理的传输介质实现的,数据链路层的作用就是在这些通过传输介质互连的设备之间进行数据处理.
相互直连的设备之间使用地址实现传输,这种地址叫做MAC地址.
MAC地址,即Media Access Control Address,用于标识网络设备的硬件物理地址.
(1)主机具有一个或多个网卡(NIC),路由器具有两个或者两个以上的网卡,其中每个网卡都有唯一的MAC地址(网卡在出厂时就确定了,不能修改)
(也有例外的情况,虚拟中的MAC地址,不是真实的MAC地址,可能会冲突.也有些网卡支持用户自己配置MAC地址)
(2)网络通信,即网络数据传输,本质上是网络硬件设备将数据发送到网卡上,或从网卡接收数据.
(3)硬件层面,只能基于MAC地址识别网络设备的网络物理地址.
7. 物理层
将数据的0,1转换成电压和脉冲光传输给物理的传输介质.
- 网络层和数据链路层之间的关系
网络层是对数据进行传输,数据链路层也是对数据进行传输,那么这两个有啥区别?
简单概述就是,网络层负责将整个数据发送给最终目的地址,所以主要负责寻址和路由选择.而数据链路层只负责发送一个分段内的数据.
计算机网络中也需要数据链路层和网络层这两个分层才能实现向目标地址的通信.
举个例子:
张三现在人在广州,打算北京朝阳区去找朋友玩.他除了需要一张详细的行程表,还需要有若干个车票,飞机票.这样才能到达目的地.
广州就是源IP地址,北京朝阳区就是目的IP地址.
而这张行程表就相当于网络层的作用,它告诉了你到终点那具体如何走,走哪条路;而这些车票飞机票就是数据链路层的作用,数据链路层只负责一个分段的传输,比如先到广州的飞机场,就通过坐滴滴的方式去.
这两者可以说是缺一不可,没有这两个互相配合就无法到达最终目的地.
张三需要汽车到达高铁站,下站后又需要再次通过汽车到飞机场,然后由飞机从广东飞往北京,到达北京的飞机场,然后又通过汽车,高铁等交通工具,最终到达目的地。从起点到目的地的路线,是需要经过规划的,也就是需要一个行程表,如果没有行程表,那就无法到达最终目的地。而如果只有行程表,没有这些交通工具,依旧无法到达目的地。网络层的作用就是规划出这个行程表,规划出到达最终目的地的具体路线。通过数据链路层进行某一个区间内的数据传输,相辅相成,完成传输。
TCP/IP是当今计算机网络界使用最为广泛的协议。TCP/IP的知识对 于那些想构筑网络、搭建网络以及管理网络、设计和制造网络设备甚至
是做网络设备编程的人来说都是至关重要的。
可以看到,TCP/IP与OSI在分层模块上稍有区别.最明显的区别是TCP/IP将OSI的应用层,表示层,会话层统一为应用层.
OSI参考模型注重"通信协议必要的功能是什么",而TCP/IP则更强调"在计算机上实现协议应该开发哪种程序".
关于TCP/IP的各个分层:
虽然之前已经介绍过OSI各个分层了,但TCP/IP同OSI还是有区别的.
这里大致介绍一下,详细的在后边进行介绍.
保证数据传输的可靠性(TCP协议)是传输层的一个重要作用.但实际上将数据传输给对端的处理是由网络层来完成的.网络层的作用是在网络与网络相互连接的环境中,将数据从发送端主机发送到接收端主机.
关于网络层中的几个协议(举例+简单介绍):
IP:
IP是跨越网络传输数据包,使整个互联网都能收到数据的协议,在传输期间,使用IP地址作为主机的标识.
IP地址还隐含着数据链路层的功能,通过IP,相互通信的主机之间不论经过怎么样的底层数据链路都能实现通信.
IP属于非可靠性传输的协议,它不具有重发机制.
----通过上一层,即传输层(TCP协议)来保证可靠性.(不同分层负责不同的功能)
注:网络层中的IP协议,以及传输层中的TCP协议,这两个是整个TCP/IP中最重要的协议.
ICMP:
ICMP协议是一种面向无连接的协议,用于传输出错报告和错误信息.(错误侦测和回报机制)
IP数据包在发送途中一旦发生异常导致无法到达对端目标地址时,需要给发送端发送一个发生异常的通知.ICMP就是为了这一功能而制定的.它有时也被用来诊断网络的健康状况.
ARP:
从分组数据包的IP地址中解析出物理地址(MAC地址)的一种协议.
传输层
传输层中两个重要的协议:
TCP:
TCP是一种面向有连接的传输层协议。它可以保证两端通信主机之 间的通信可达。TCP能够正确处理在传输过程中丢包、传输顺序乱掉等 异常情况。此外,TCP还能够有效利用带宽,缓解网络拥堵。 然而,为了建立与断开连接,有时它需要至少7次的发包收包,导 致网络流量的浪费。此外,为了提高网络的利用率,TCP协议中定义了 各种各样复杂的规范,因此不利于视频会议(音频、视频的数据量既 定)等场合使用。
UDP:
UDP有别于TCP,它是一种面向无连接的传输层协议。UDP不会关 注对端是否真的收到了传送过去的数据,如果需要检查对端是否收到分 组数据包,或者对端是否连接到网络,则需要在应用程序中实现。 UDP常用于分组数据较少或多播、广播通信以及视频通信等多媒体 领域。
应用层(会话层以上的分层)
TCP/IP的分层中,将OSI参考模型中的会话层、表示层和应用层的功能都集中到了应用程序中实现。
5.数据的封装和分用
这里以TCP/IP为例:
每个分层中,都会对所发送的数据附加一个首部,在这个首部中包含了该层必要的信息,如发送的目标地址以及协议相关信息.
我们这里举一个例子,来大致描述一下TCP/IP是如何对数据进行处理(传输)的.
例如,在QQ发送一个"hello".
由于上到下进行封装
①应用层:
当点击发送后,就进行了TCP/IP通信中应用层协议的处理.
首先,应用层会进行编码处理,按照某个数据格式进行编码,这时候就相当于OSI表示层的作用.即将特定的数据转化为通用的标准数据传输格式后再发送出去,接收端该计算机特定的数据格式,然后再进行相应的处理.
在编码转化完成之后,还可能会经过相当于OSI协议会话层的处理,即采取何种建立连接的方式(一条条发送,每发完一条断开连接,或者持续一条条发送,发送完后才断开连接.又或者一次性发送完,再断开连接).需要注意的是,会话层只是决定建立连接和断开连接的时机,真正建立连接和断开连接是由传输层负责的.
再接下来应用层会将hello这个字符串按照某种应用层协议(程序员自己约定的)构造成一个应用层数据报(包).
例如:我;726263423;李四;546876534;2021/12/12,21:30;hello
而后将这个数据报传给传输层.
②传输层:
传输层收到应用层数据报后,通过相应的协议再次封装(这里使用UDP)
如果是TCP协议的话,还需要建立连接.
然后将这个数据传给网络层
③网络层:
网络层使用IP协议进行传输数据.
IP协议的作用是将分组的数据包发送到目的主机.
IP将UDP传过来的UCP首部和UDP数据合起来当做自己的数据,并在UDP首部的前端再加上自己的IP首部(报头).构造成IP数据包
IP包生成后,参考路由控制表决定接受此IP包的路由或主机.随后,IP包将被发送给连接这些路由器或主机网络接口的驱动程序,以实现真正发送数据.
(如果尚不知道接收端的MAC地址,可以利用ARP寻址进行查找.只要知道了对端的MAC地址,就可以将MAC地址和IP地址交给以太网的驱动程序,实现数据传输)
生成IP包后,往后就是
④网络接口(以太网驱动)的处理,即数据链路层和物理层
数据链路层
在这些通过物理传输介质互连的设备之间进行数据处理,使用"以太网"协议,按照以太网数据帧的格式进行组织.
物理层
物理层将这个数据,以二进制的方式,将0,1转化成电压(电信号)和脉冲光(光信号)传输给物理的传输介质.
从IP传过来的IP包,对于以太网驱动来说只不过是就是数据.给这些数据附加上以太网首部并进行发送处理.(以太网首部中包含了接收端MAC地址,发送端MAC地址以及表示以太网类型的以太网我数据的协议).
然后将产生的以太网数据包通过物理层传输给接收端主机.
以上就是封装的过程,由上到下进行封装.
关于包的流动:
分组数据包(以下简称包)经过以太网的数据链路时的大致流程如下图:
包在流动时,从前往后依次被附加了以太网首部,IP包首部,UDP包首部(或者TCP包首部),而包的最后 则追加了以太网包尾(包首部附加于包的前端,而包尾则指追加到包的 后端的部分。)
每个包首部中至少都会包含两个信息:一个是发送端和接收端地址,另一个是上一层的协议类型。
经过每个协议分层时,都必须有识别包发送端和接收端的信息。以 太网会用MAC地址,IP会用IP地址,而TCP/UDP则会用端口号作为识别 两端主机的地址。
此外,每个分层的包首部中还包含一个识别位,它是用来标识上一 层协议的种类信息。例如以太网的包首部中的以太网类型,IP中的协议类型以及TCP/UDP中两个端口的端口号等都起着识别协议类型的作用。就是在应用的首部信息中,有时也会包含一个用来识别其数据类型的标签。
当接收端主机接收到数据包后,就会对数据包从下到上,进行层层分用.
(这里可以理解为拆快递)
- 网络接口(以太网驱动的处理)
主机收到以太网包以后,首先要判断是否是自己的包,就从包首部的MAC地址来判断.如果不是自己的包就丢弃数据(也可不丢弃).
若是发送给自己的包,则对类型域进行检查,判断这个包是什么类型的包,此处为IP包.
数据链路层对这个以太网数据帧进行分析,去掉帧头和帧尾,获取中间的负载,然后交给上层协议(网络层)
- 网络层的处理
IP模块收到IP包之后也会进行类似的处理,根据首部的IP地址(接收端)判断是否为发送给自己的包.是的话就根据类型域来判断是传输层是何种协议.(这个例子中是UDP协议).
IP协议就会按照协议的格式来解析数据,去掉报头,获取到中间的负载部分,再交给上一层,即传输层.
- 传输层的处理
传输层通过UDP协议再解析这个数据,去掉UPD报头,再交给应用层协议
- 应用层的处理
应用层协议对内容进行解析,取出其中的关键信息:“hello”