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

news2024/11/17 7:35:22

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

  • 一、OSI模型
    • 1、什么是OSI模型
    • 2、osi七层参考模型
    • 3、我更想介绍TCP/IP模型
  • 二、TCP/IP模型
    • 1、TCP/IP模型起源
    • 2、TCP/IP模型是五层还是四层?
    • 3、两层TCP/IP模型
    • 4、传输层(也叫传输控制层)
      • 4.1 TCP
      • 4.3、三次握手
      • 4.4、数据传递
        • 4.4.1、一个服务的80端口,==理论上==,可以和一台机器建立多少客户端链接?
        • 4.4.2、两个服务两个端口,可以和一台机器建立多少个链接?
      • 4.5、四次分手
    • 5、网络层
      • 5.1、ip、netmask、geteway
      • 5.2、路由表
    • 6、链路层
  • 三、其他关联知识点图谱
    • 1、分布式和高并发
    • 2、分布式和IO
    • 2、三层模型
  • 四、实战
    • 1、协议(protocol)、建立链接
      • 1.1、网络链接
        • 1.1.1、第一步:使用nc和百度建立链接
        • 1.1.2、第二步:向百度发送请求
        • 1.1.3、第三步:百度接受你发送的请求,处理后,把处理后的数据发送给你。
        • 1.1.4、第四步:获取百度发送的数据
        • 1.1.5、总结:
      • 1.2、和redis建立链接
        • 1.2.1、第一步:启动redis服务
        • 1.2.2、第二步:使用nc和redis建立链接
        • 1.2.3、第三步:nc向redis服务发送数据
        • 1.2.4、第四步:redis-server服务处理后,发送给请求.
        • 1.2.5、第五步:获取redis发送的数据
      • 1.3、建立一个socket的链接
    • 2、第一次握手后的状态(state)
    • 3、三次握手+传输数据+四次分手
      • 3.1、三次握手
      • 3.2、向百度请求数据,发送url
      • 3.3、百度回复数据
      • 3.4、四次分手
    • 4、网卡配置文件
    • 5、从tcp到arp整个过程抓包

  • 前言:原本这篇应该写《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、传输层(也叫传输控制层)

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

4.1 TCP

  • TCP协议:面向链接的、可靠的传输协议。
  • 链接:资源的开辟。在这里插入图片描述

4.3、三次握手

  • 三次握手就是三个数据包
  • 三次握手就是资源开辟的过程
    在这里插入图片描述

4.4、数据传递

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

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

  • 一个机器有65535个端口。在这里插入图片描述

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

在这里插入图片描述

4.5、四次分手

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

在这里插入图片描述

5、网络层

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

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

5.1、ip、netmask、geteway

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

  • ip和子网掩码:二级制安位与得到网络号(局域网的号) :192.168.3.0,而245就是主机号
    在这里插入图片描述

5.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的地址)

6、链路层

在以下图片中,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。。。等
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/55502.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【算法面试题汇总】LeetBook列表的算法面试题汇总---动态规划题目及答案

整理不易留个小心心呗🥰 如果有更好的或者是我有错的地方还请各位大佬指出哦 有些是copy的还望不要介意 动态规划至少有k个重复字符的最长子串二叉树中的最大路径和最长连续序列打家劫舍完全平方数最长上升子序列*零钱兑换矩阵中的最长递增路径至少有k个重复字符的最…

java计算机毕业设计ssm民宿管理系统设计7lky4(附源码、数据库)

java计算机毕业设计ssm民宿管理系统设计7lky4(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff0…

Linux服务器上Neo4j的安装、迁移

目录 1、环境 2、下载 3、修改配置 4、启动及其他命令 5、客户端访问: 6、数据迁移 1、环境 Neo4j是基于Java的图形数据库,运行Neo4j需要启动JVM进程,因此必须安装JAVA SE的JDK。 neo4j版本:neo4j-community-3.5.6 2、下…

使用 Learner Lab - 使用 API Gateway 触发 AWS Lambda

使用 Learner Lab - 使用 API Gateway 触发 AWS Lambda AWS Academy Learner Lab 是提供一个帐号让学生可以自行使用 AWS 的服务,让学生可以在 100 USD的金额下,自行练习所要使用的 AWS 服务,如何进入 Learner Lab 请参考 使用 Learner Lab …

第十三章 DFS与BFS(保姆级教学!!超级详细的图示!!)

第十三章 DFS与BFS一、深度优先搜索1、什么是DFS?2、DFS代码模板(1)问题:(2)分析:(3)模板:3、DFS代码分析二、广度优先搜索1、什么是BFS?2、BFS代…

就是把一个数组中相同类别数据,组成新的数组

效果图如上,就是把一个数组中相同类别数据,组成新的数组,每个数组最后加一个空对象,对象对应的格式要做些许改变 分店 品牌 业绩(元) 订单个数 单值(元) {{item.shopname}} {{item.shopname}} {{item.shopname}} {{item.shopname}…

《InnoDB引擎九》InnoDB关键特性-自适应哈希索引

InnoDB 关键特性 InnoDB存储引擎的关键特性包括: Insert Buffer (插入缓冲)Double Write (两次写)Adaptive Hash Index (自适应哈希索引)Async IO (异步IO)Flush Neighbor Page (刷新领接页) 这些特性为InnoDB存储引擎带来了更好的性能以及更高的可靠性。 自适应哈…

猿如意开发工具|emeditor

写在前面 昨天升了下系统,可以下载了,我就试了试 正文 在客户端里搜索我所需要的工具,就可以搜出来 这里我已经下好了,直接点开文件就好了 再点开文件 点击下一步,接下来还有几个步骤,都点下一步就可以了…

【HBuilder X】解决HBuilder X内置浏览器显示过大影响使用

1- 前言 不知道宝子们有没有遇到过这种情况,小媛发现自己的内置浏览器过大,很大,很丑,占了半个屏幕,像下图那样。 也试了几种方法,比如: 看自己的版本不是最新,或者和其他人的不一样…

嫁给程序员老公,我后悔了

01 在我还没长开的时候,就常听人说,有两种男人不能嫁:一种是兵哥哥,另一种是程序员。前者见不着,后者死的早。 一想到不等头发花白,就要踟蹰独行,我就害怕的厉害。所以,很长一段时…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java高校教室管理系统9y8cv

相信很多和我一样的同学,因为实习,因为考研和考公等等,来不及做毕业设计,双专业的话 到时肯定忙不过来。提前做好准备吧,能自己完成的尽量自己完成,尽量不要找别人。自己的毕业前的一次大作业。努力完成也有…

Java项目:ssm高校党员管理系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 高校党员信息管理系统,分为普通用户和管理员两种角色。 普通用户登录后主要功能有: 我的中心:首页、个人资料、修改密…

广州蓝景分享—开发人员都知道的JavaScript技巧

JavaScript包含各种对典型编程思想有用的一些技巧,在实际开发中,我们通常希望减少代码行数;因此,今天这些技巧代码希望可以帮助到你。 现在我们就开始今天的内容吧。 1、与Javascript对象相关的 01)、对象解构 将对象的值解构为…

Vue2.0简讲!

Vue2.0简讲 Draven入门1.1、响应式渲染1.1.0、Vue创建1.1.1、指令(7)1.1.2、class与style绑定HTML Class对象语法数组语法绑定内联样式对象语法数组语法1.1.3、条件渲染v-if else-iftemplate v-if1.1.4、列表渲染v-forkey数组更新检测列表渲染Vue2列表渲染Vue3过滤应用(模糊查询…

机器学习与数据挖掘——前言

如果有兴趣了解更多相关内容,欢迎来我的个人网站看看:瞳孔空间 这是从老师的PPT里面提取出来的,知识点分布比较零散,可能他做PPT的时候也没想那么多。 一:机器学习 机器学习的定义:一个计算机程序被称为…

前端岗位初入职场后的最初一段时间需要做什么

文章题目有点长,叫 《前端岗位初入职场后的最初一段时间需要做什么》,说下写这篇文的初衷,在前端自学团里有很多刚毕业或者是刚从培训班出来的同学,在群里天天讨论着找工作和面试的事情,面试的题在很多app或者小程序可…

四、【React-Router6】高亮 NavLink

项目修改自 上一节 的 Demo 这里需要注意的变化 默认高亮样式类名如果依然是 active 则依然默认有效 6 里移除了 activeClassName ,如果我的高亮样式类名是 peiqi,需要配置 className 为一个函数 函数接收两个参数 isActive:是否激活isPendi…

Arduino开发实例-DIY双向访客计数器和自动灯光控制

双向访客计数器和自动灯光控制 1、应用介绍 本应用将使用 Arduino 创建双向访客柜台和自动灯光控制系统。该应用基于一对 IR(红外)传感器,可在出现中断时检测障碍物。实际上,该系统可以检测来自两个方向的访客。从而对进入的访客数量和离开的访客数量进行计数。 该双向访…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java高校心理健康咨询平台vknhv

毕业设计其实不难,主要毕业的时候任务太紧了,所以大家都非常忙没有时间去做,毕业设计还是早做准备比较好,多花点时间也可以做出来的,建议还是自己动手去做,比如先选一个题,这样就有方向&#xf…

GIS工具maptalks开发手册(三)01——绘制工具

GIS工具maptalks开发手册(三)01——绘制工具 效果 代码 1、html官方版 <!DOCTYPE html> <html> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1"> <title>交互 - 绘制…