小言_互联网的博客

【操作系统二】图解TCP/IP模型+实战

332人阅读  评论(0)

【操作系统二】OSI模型和TCP/IP模型

  • 前言:
    原本这篇应该写《c++进程通信——套接字(socket)》,但是实际查找相关资料和视频教程发现,我之前的理解还是太浅薄,必须要把TCP/IP和计算机操作系统IO了解清楚,才可以理解清楚socket,所以,接下来这两篇博文,我会重新介绍下这些知识。此外,后面还会找机会介绍下rpc通信。

  • 简介:
    本文将以最简单明了的图,给大家讲解清楚TCP/IP模型。之前已有的文章大家看起来之所以晦涩难懂,有的即使懂了,也难以记忆,原因是计算机的这些知识太抽象了,并没有对那些凭空的知识、加以实战,供大家理解和实物化。本文介绍到的相关知识,都会在最后一节的实战,给大家详细的讲解下。(以保证非计算机学科的同学都可以看懂和理解)

一、OSI模型

讲解TCP/IP模型前,我们先简单的介绍下OSI模型。

1、什么是OSI模型

What Is the OSI Model?
The Open Systems Interconnection (OSI) model describes seven layers that computer systems use to communicate over a network. It was the first standard model for network communications, adopted by all major computer and telecommunication companies in the early 1980s

The modern Internet is not based on OSI, but on the simpler TCP/IP model. However, the OSI 7-layer model is still widely used, as it helps visualize and communicate how networks operate, and helps isolate and troubleshoot networking problems.

OSI was introduced in 1983 by representatives of the major computer and telecom companies, and was adopted by ISO as an international standard in 1984.

以上英文节选自OSI Model

翻译:

什么是OSI模型?
开放系统互连(OSI)模型描述了计算机系统用于通过网络进行通信的七个层。它是网络通信的第一个标准模式,在20世纪80年代初被所有主要的计算机和电信公司采用。
现代互联网不是基于OSI,而是基于更简单的TCP/IP模型。然而,OSI 7层模型仍然被广泛使用,因为它有助于可视化和沟通网络的运行方式,并有助于隔离和排除网络问题。
OSI于1983年由主要计算机和电信公司的代表引入,并于1984年被ISO采纳为国际标准。

2、osi七层参考模型

  • osi模型,也被有的文章称为“osi七层参考模型”,可能是部分人觉得,它仅仅是一个参考吧。

3、我更想介绍TCP/IP模型

从上文翻译我们可以看到。现代互联网不是基于OSI,而是基于更简单的TCP/IP模型,所以我们后面不再过多介绍了,接下来我会详细介绍下TCP/IP模型及应用。

二、TCP/IP模型

1、TCP/IP模型起源

20世纪50年代末,正值美苏冷战时期,当时美国军方为了避免自己的计算机被炸毁,导致整个网络瘫痪,于是美国国防部的高级研究计划局建设了一个军用网,保证即便部分计算机被袭击摧毁,其他部分仍然正常通信和联系。这个军用网络,就是大名鼎鼎的“阿帕网。”
早期,阿帕网采用的是一种名为NCP的网络协议,NCP协议有一个很大硬伤,它只能用于同构环境中。
什么叫同构环境?
意思就是使用Windows操作系统的用户,不能和MacOS操作系统的用户进行通信,也不能和Android 的用户通信。
1974年,卡恩和瑟夫带着研究成果,在IEEE期刊上,发表了一篇题为《关于分组交换的网络通信协议》的论文,正式提出TCP/IP,用以实现计算机网络之间的互联。
IP协议为每一台联网的设备分配一个地址,TCP则负责发现传输问题。
1983年,美国国防部高级研究计划局决定淘汰NCP协议,TCP/IP取而代之。
参考:一文看完TCP/IP的发展历程

2、TCP/IP模型是五层还是四层?

  • 物理层我们考虑的比较少。因此很多时候也可以称为 TCP/IP四层模型。

3、两层TCP/IP模型

  • 其实,并没有《两层TCP/IP模型》这个概念,
  • 只是在一节课程中,看到马士兵教育中的周老师叫了这个说法,虽然不准确,但是细想下来,对初级水平,计算机网络知识了解不深的同学来说,简化网络通信的理解还是有帮助的,故在次记录下。
  • 两层为:程序 和内核公共两层。

4、应用层

  • 应用层简单来说,就是进程所在从层。
  • 这一层的协议较多,比如常见的http和ftp等,但是这一层不是我们今天文章的重点。

5、传输层(也叫传输控制层)

  • 产生控制的包
    传输层主要是TCP和UDP两个协议,这里我们主要讲解下TCP协议。

5.1 TCP

  • TCP协议:面向链接的、可靠的传输协议。
  • 链接:资源的开辟。

5.2、三次握手

  • 三次握手就是三个数据包
  • 三次握手就是资源开辟的过程

5.3、数据传递

  • 我们以socket为例,讲解下数据传递的相关知识。(后面《实战》部分会详细的介绍数据传递的具体过程)
  • 并非是说,我们把socket放在这里讲解,并非说三次握手后就是socket,而是说,scoket需要三次握手,三次握手后就可以传数据了。

5.3.1、一个服务的80端口,理论上,可以和一台机器建立多少客户端链接?

  • 一个机器有65535个端口。

5.3.2、两个服务两个端口,可以和一台机器建立多少个链接?

5.5、四次分手

  • 四次分手就是释放资源的过程

6、网络层

网络层是为了解决什么问题?

  • 解决问题:传输控制层产生的包,怎么发
  • 点分字节:两个点之间是1个字节,1个字节8位。就是0-255
  • 两个局域网怎么通信

6.1、ip、netmask、geteway

ip:192.168.3.245
子网掩码:255.255.255.0
网关:192.168.3.1

  • ip和子网掩码:二级制安位与得到网络号(局域网的号) :192.168.3.0,而245就是主机号

6.2、路由表

  • 告诉主机应该往哪里发,怎么走。
  • 下一跳:拿到下一个跳点的信息。(网络工程师规划谁作为谁的下一跳的地址)

route -n

  • 路由表

说明:

  • 1:本机接入了局域网的网关,
    • (网关:192.168.3.0,0.0.0.0表示不需要网关,ens33表示网卡ens33)
    • 本机给局域网中的任何一个主机发送数据,不需要网关。
  • 2:为了说明这个作用,我们先ping下百度

按照我们上面说的:IP地址和子网掩码做二进制与

  • ip &Genmask = Destination
  • 14.215.217.38 &0.0.0.0 =0.0.0.0
  • 我们就拿到了下一个跳点的地址为Gateway:192.168.3.1
  • 基于上面说的,我们就把包发到了下一个跳点,就是我们网络层吓一跳的含义。拿到下一个跳点的地址
  • ping局域网络中的,走上图中的1.

问题:网关地址找到了,数据包由网关交给百度,这个IP地址应该放百度的IP(14.215.177.38)还是网关的的地址(192.168.3.1)?
答:应该放百度的IP,问,放百度的IP,你家的网关怎么知道吓一跳发给谁?
答:找到网关地址后,应该找mac地址,把IP地址套起来。(链路层网卡的mac的地址)

7、链路层

在以下图片中,IP和端口号,我们简单写为SIP.(如实战中介绍的百度的IP和端口号)

  • 链路层,在网卡地址间传递。(mac地址)
  • 把目标IP和端口号封包,在链路层传送。
  • 每到一个节点,都需要更换mac地址,而IP地址和端口号,是不变的。(比如百度的IP和端口号)- 查看网关对应的mac地址

arp -a

  • 网卡的地址如下,可以找到网关对应的网卡地址(mac)

三、其他关联知识点图谱

1、分布式和高并发

  • 分布式服务是为了解决什么问题?

2、分布式和IO

  • 分布式服务学清楚,必须了解io。(后面我会专门开一篇博客讲下计算机IO)

2、三层模型

来自于
TCP/IP五层(或四层)模型:https://blog.csdn.net/m0_59155415/article/details/124909497

  • 虽然arp大多被归档为网络层,因为arp广播会找到网卡的mac地址,我们理解时可以按照数据链路层理解,好像也没有什么问题。

四、实战

1、协议(protocol)、建立链接

协议:要求双方必须遵守的规则(双方遵从的同一),这样大家就可以通信了。
如何建立链接?

1.1、网络链接

访问百度的过程

  • 第一步:和百度建立一个链接
  • 第二步:把发送请求的页面(url)发送给百度
  • 第三步:百度接受你发送的请求,处理后,把处理后的数据发送给你。
  • 第四步:你取到百度发送的数据后,展示。

1.1.1、第一步:使用nc和百度建立链接

  • (1).使用nc和百度建立链接(链接有了,通道有了)

nc wwww.baidu.com 80

  • 输出如下

  • (2).使用netstat查看建立的链接
    刚才的nc有没有建立链接呢,怎么确认呢?你不能听我忽悠你对吧?
    我们可以使用netstat -natp命令查看下建立的链接。(备足:实验使用centos环境,1、windows下虽然可以使用netstat,但是无法查看进程名字建立和链接。2、windows下安装的ubuntu系统使用netstat也不可以,同样查看不到。)

netstat -natp

  • 输出如下

  • (3)、我们可以查看下百度的ip.
    其ip就是我们nc建立链接的ip地址:110.242.68.4

1.1.2、第二步:向百度发送请求

获取百度的主页,HTTP协议,协议版本号1.0.

GET / HTTP/1.0

  • 如下图

1.1.3、第三步:百度接受你发送的请求,处理后,把处理后的数据发送给你。

这个过程是百度内部处理的,我们看不到,但是我们可以看到第四步的数据。(其实百度回复的数据,我们可以使用抓包工具抓到,后面我们会在《四、实战、三》中使用抓包工具tcpdump,再深入的讲解下)

1.1.4、第四步:获取百度发送的数据

  • 敲击两次enter键。看到输出如下

1.1.5、总结:

向百度获取步骤是上面四个,简单来说,其实也可以说成是两个。

  • 第一:建立链接
  • 第二:发送请求。

1.2、和redis建立链接

除了和百度建立网络链接,其实还可以和其他服务端建立链接。比如redis-server.

  • 第一步:启动redis服务
  • 第二步:使用nc和redis建立链接
  • 第三步:nc向redis服务发送数据
  • 第四步:redis服务处理后,发送给请求.
  • 第五步:获取redis发送的数据

1.2.1、第一步:启动redis服务

redis服务端的端口号6379.

  • 启动redis-server服务

1.2.2、第二步:使用nc和redis建立链接

  • 和redis-server建立链接输出如下
  • 使用netstat -natp查看

1.2.3、第三步:nc向redis服务发送数据

redis是一个键值数据库,设置key1 的值为1234

set key2 1234

  • 输出如下

1.2.4、第四步:redis-server服务处理后,发送给请求.

  • 此过程在redis的服务端,所以我们在此看不到。(同百度回复数据)

1.2.5、第五步:获取redis发送的数据

  • 同1.2.3的图,redis服务端返回了一个+ok

1.3、建立一个socket的链接

  • 后面我会单独写一篇c++的demo《c++进程通信——套接字(socket)》,详细的介绍。

总结:建立链接,就是在内核分配了资源。分配的资源用来发送和接收数据。

2、第一次握手后的状态(state)

  • 我们从1.1.1和1.2.2中可以看到,平时的状态是LISTEN——listen,建立链接后状态是ESTABLISHED——established。那第一次握手的状态是什么呢?(即发送第一次握手的数据包后的状态)
  • 从下图中,我们可以看到,状态是SYN_SENT

  • 类比第二次握手,同样的道理,只有在三次握手后,状态才是已经建立(ESTABLISHED),(此说法针对服务端,客户端应该是在第二次握手后)
  • 本实验主要是让大家对建立链接,发送数据包,这个过程,有一个清晰的认识。

3、三次握手+传输数据+四次分手

使用tcpdump查看下四次分手的过程。

  • 首先,打开抓包工具tcpdump

tcpdump --nn -i ens33 port 80
或者也可以使用,tcpdump --nn -i - X ens33 port 80,可以看到具体的抓到的数据。

  • 输出如下

  • 然后,请求百度主页(如下图,可以看到百度页面已经请求回来了)

curl http://www.baidu.com

  • 输出如下

  • 最后:查看tcpdump抓到的包

  • 分析抓到的包

3.1、三次握手

  • 第一次握手:本机给百度发了一个数据包,请求链接
  • 第二次握手:百度给本机回复了一个数据包,同意你的链接请求
  • 第三次握手:本机给百度回复了一个数据包,同意
  • 备注:点(.)代表同意。

3.2、向百度请求数据,发送url

三次握手建立链接后,就可以通信了

  • 1、本机给百度发送url,请求百度主页
  • 2、百度回复本机:同意

3.3、百度回复数据

百度分三次回复数据包

  • 百度给本机发送第一个数据包
  • 本机给百度回复:收到

备注:

  • 第二个、第三个包、和第一个包的发送和接受相同,不做过多介绍
  • 按照道理说,三个数据包的发送和接受,应该是一起的,不知为何中间加了一次分手,怀疑是抓包的数据顺序有些问题。本人就不做过多讨论了。

3.4、四次分手

  • 第一次分手:本机和百度发,我要和你分手
  • 第二次分手:百度和本机回,我同意你说的分手
  • 第三次分手:百度和本机发,分手吧
  • 第四次分手:本机和百度回,同意

4、网卡配置文件

  • 命令行

cd /etc/sysconfig/network-scripts/
cat ifcfg-ens33

5、从tcp到arp整个过程抓包

  • 我们删除了网关
  • arp广播会问,谁有192.168.3.1
  • 然后就有回复,我有192.168.3.1,网卡地址是,然后就打包发出去了,至于怎么在网卡间传播的,可以看我们在链路层画的流程图。

arp -d 192.168.3.1 && curl http:www.baidu.com
tcpdump --nn -i ens33 port 80 or arp

  • 先用tcpdump监听,
  • 然后,使用arp删除网关,并立刻获取百度的网页。
  • 接着,请求到网关时,因为不知道往哪里发,就是采用arp广播。
  • 谁有网关192.168.3.1,
  • 网关听到了就会回复:我有192.168.3.1,他对应的网卡地址是在网卡cc::bb。。。等

转载:https://blog.csdn.net/junxuezheng/article/details/127972497
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场