TCP/IP协议簇自学笔记

摘抄于大学期间记录在QQ空间的一篇自学笔记,当前清理空间,本来想直接删除掉的,但是感觉有些舍不得,因此先搬移过来。

曾经,我只知道socket函数能进行网络间数据的通信,知道tcp/ip协议也是用来进行网络数据之间通信的协议。而后开始接触了http,ftp,udp,ip,还遇上了路由器,我开始模糊了,他们到底谁是网络的真正领导者,他们又有何关系?现在通过一本51cto技术论坛的文档,我才算真正明白了什么是网络通信。

一、TCP/IP的层次结构

        TCP/IP分为五成,从上到下分别是应用层、传输层、internet层、网络接口层,分别对应OSI结构中的应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。
         其中应用层包括的协议有Tclnet(远程登录协议)、ftp(文件传输协议)、http协议,smtp(邮件传输协议)、DNS协议
                传输层包括的协议有TCP和UDP协议
                网络层包括的协议有IP协议,以及ARP、RARP、IGMP 、ICMP
                数据链路层的由逻辑链路子层和介质访问子层
               物理层有SONET、SDH、PDH 
                 

 原来这些协议相辅相成,各施其职,共同完成了网络间数据的传输,他们谁也离不开谁,就像我们人体的心脏大脑等,工作在不同层次上,共同组成了internet协议大家族

二、IP协议(TCP/IP协议族心脏)

          IP协议是internet协议族最重要的协议,位于物理链路层之上的网络层,向上层协议屏蔽了各种不同的物理链路的差别,因此能将各种不同介质的网络互联起来。所有在internet上传输的数据以ip数据包格式传输,ip提供不可靠、无连接的数据包传送服务,即它不能保证ip数据包能否成功到达目的地。ip仅提供最好的传输服务。
          ip协议的工作对象是数据包。ip协议在处理数据包时,只会根据数据包本身的情况处理数据包,不会考虑不同数据包之间的关系。因此对两个目的地相同的数据包的处理可能是不同的。其次,ip协议的责任是将数据正确传递到目的地,ip协议用能够表示和识别数据包的地址,并能根据地址选择数据包传递的路径。     
          ip协议工作的对象是数据包,对上层传递来的数据包进行封装ip地址,结构如下:

三、ARP协议(IP地址与物理地址间的映射)

        由上可知要将一个ip数据包传送到目的地,必须要有一只标识目的地的机制,这种机制就是ip地址,ip地址是一种结构化的二进制地址,ip协议能够给通过该地址找到与该地址相关联的主机或网络设备。ip协议将上层数据包封装成ip数据包,而ip数据包的实际传输是通过将其封装在屋里网络的数据帧中并让底层物理网络来传输改帧实现的。物理网络也有一个地址机制,称为物理地址。物理网络就是通过这种物理地址来进行数据帧的发送和接收。这时出现了一个问题,因为物理网络是无法识别ip地址的,而ARP和RARP协议解决IP地址和物理地址间的映射问题。
         在以太网络(一种广播网络)中,即连接在同一个以太网中的任何主机都能接收到网络上发送的所有数据帧,但主机会检查数据帧中的目的地址是否是自己,否则将其丢弃。因此连接到网络的接口都有一对地址:IP地址和物理地址,以太网的物理地址也称MAC地址,每块以太网卡出厂时都会有一个固定的全球唯一的MAC地址。
         ARP协议使用一种询问/回答机制。主机H1要发送一个ip数据包给主机H4过程如下:这时H1先构造一个ARP请求数据包,该数据包中包含了ip地址P4,并留下一个空位表示P4的MAC地址。H1的ARP协议将ARP数据包交给网卡,让他将该ARP数据包作为广播帧发送出去。这样H1所在以太网中的所有网卡将会受到该数据帧并对其进行处理,因为他们处于同一个广播帧。处于该广播帧的主机收到这个请求数据包后就将自己的IP地址与数据包中中包含的ip地址进行比较,如果相同就表示对方在询问自己的MAC地址,如果不是,ARP协议会简单丢弃该数据包。因此,只有H4会处理这个ARP请求数据包,这时,H4会将自己的MAC地址填在MAC地址空位上,并将该数据包该数据包改为ARP响应数据包,然后让网卡将其发送给主机H1。
        对于不在同一广播帧中,该过程略有不同,需经过路由器才能将数据进行传输。ARP数据包格式:
        硬件类型字段:对于以太网该字段为1;
        协议类型字段:指明上层协议地址的类型,对于IP协议该字段为0X0800;
        操作字段:指明ARP数据包的类型,ARP请求数据包类型为1,ARP响应数据包的类型是2,RARP请求数据包为3,RARP响应数据包为4。

四、RARP协议(反向地址解析-为物理地址分配IP地址作用)

        TCP/IP进行网络通信必须要有一个IP地址,我们知道网卡的物理地址是固定在网卡上的,而IP地址通常是保存在二级存储器中并在系统启动后载入系统的。因此启动之前是没有IP地址的,RARP协议的出现解决了这个矛盾。RARP协议的实现分为客户端和服务端两部分,需要远程启动的系统必须将RARP协议的客户端固化在硬件中(如ROM),而服务器端并不是所有的TCP/IP的实现都包含了RARP协议。
        RARP协议的原理如下,需要知道自己IP地址的计算机发送一个RARP请求数据包给RARP服务器,服务器向该计算机发送一个RARP响应数据包,响应数据包中包含了请求计算机的IP地址,请求计算机在获得了自己IP地址之后就可以用它来与文件服务器通信获取自己的启动映像文件了。
        RARP数据包格式与ARP数据包的格式相同,RARP协议的工作过程如下,请求计算机构造一个RARP请求数据包,在该数据包中,计算机将发送者硬件地址和目标硬件地址都设为自己的物理地址,然后将该数据包广播到网络中,网络中所有的计算机都能接收到该数据包,但只有RARP服务器会处理,RARP服务器将请求计算机的IP地址放入数据包的目标协议地址字段中,并将数据包类型该位4(响应),然后将响应数据包发送给请求计算机。如果出现网络故障或RARP服务器失效时,RARP请求将会失败。通常请求计算机对这种情况的处理是使用超时重发机制,如果经过多次重发,系统机会向用户报告一个错误。因此,为保证服务器失效时计算机能正常启动,通常在一个网络中放置多个RARP服务器,但这样将造成网络流量的增多。

五、ICMP协议(互联网控制消息协议)

        ICMP协议就是一种能让我们对网络进行调试的报错机制,它能够让发现错误的路由器向数据包的源站发送一个出错消息来报告出错原因。ICMP的错误报告只能通知出错数据包的源主机,而无法通知从源主机到出错路由途中的所有路由器。例如,主机H1向H2发送一个IP数据包,经过了RA和RB路由器,到达RC路由器的时候RC发现无法将该数据包转发到H2。此时RC能知道数据包的源地址和目标地址但它无法知道该数据包途中经过了那些其他的路由器,因此RC只能将出粗消息发送给数据包的源地址H1。
        因为ICMP数据包封装在IP数据包中,因此ICMP数据包即出错消息的传输也有可能出错,这时就需要ICMP数据包产生另一个ICMP数据包,因为这样加重了网络繁忙,因此ICMP协议规定,如果传输ICMP数据包的IP数据包出错,不能为该数据包产生新的ICMP数据包。

六、路由器工作原理

        路由器收到一个数据包时,必须要能确定应该从哪个端口将该数据包转发出去。例如一个202.119.12.1网段的路由器接收到来自202.119.12.24的数据包(假设路由器接入了一台主机IP地址为202.119.12.24),者路由器必须知道将此数据包从连接到此主机的端口发送出去。如果接收到非12网段的数据包,通常路由器是通过查找一张路由表来确定转发端口的,在路由表中,每一项都说明了通往一个目标地址应该通过哪个端口进行转发,是直接转发给目的地还是需要通过下一个路由器再进行转发。因此一个基本的路由表的表项包含以下几个字段:目的地址、下一站的地址、转发端口。


    路由器的内部通过使用路由表进行数据转发的机制,因此路由表是如何建立的呢?第一种手段是路由器根据路由器各端口直接连接的网络自动产生一些路由表项(即直接转发);另一种就是通过路由协议的帮助,如路由器RA必须要知道通往某个网络(202.119.12..0/24)必须经过路由器RB,那么RA如何知道这一点呢?方法只有一个,就是RB告诉RA这一点,RB就是通过路由协议将这条信息告诉了RA,RA知道后更新了路由表。

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

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

相关文章

JAVA OPCUA 服务端开发,客户端连接会话监听和订阅事件监听

前言 关于使用milo开源库,开发opc ua服务器,有网友咨询如何设置服务端如何监听客户端的连接或断开事件,如何监听客户端发起订阅事件的代码实现,于是我完善了这部分的空缺整理整了这篇教程,希望能解决有同样需求,但是遇到困难的网友!因为milo没有官方文档的教程且网上详…

三数之和 Leecode 2024/12/02

思路&#xff1a;1. 找到所有不重复下标的整数组合。2. 在所有组合中找到和为0的组。 暴力解法超时&#xff01;&#xff01;&#xff01; public static List<List<Integer>> threeSum(int[] nums) {int num_len nums.length;HashSet<List<Integer>&g…

c++领域展开第一幕——入门基础(命名空间、iostream、缺省参数、函数重载、nullptr、inline(内联函数))超详细!!!!

文章目录 前言一、c的第一个程序二、命名空间2.1 namespace 的价值2.2 namespace 的定义2.3 命名空间的使用 三、c的输入和输出四、缺省参数五、函数重载六、nullptr七、inline总结 前言 今天小编带着大家进入c的大门&#xff0c;虽然c难&#xff0c;但好事多磨&#xff0c;一起…

word表格 转换html 并导出.docx和图片(vue)

一、复制word表格转换成html代码 &#xff0c;在页面中显示 并且能导出 1、导出使用了htmlDocx插件 //1、使用html-docx-js 插件 npm install html-docx-js --save npm install html2canvas //2、在页面中引入 import htmlDocx from html-docx-js/dist/html-docx.js; import …

我们项目要升级到flutter架构的几点原因

一、探索 Flutter打造卓越移动应用的新时代框架 在移动应用开发的世界里&#xff0c;Flutter已经成为了一个炙手可热的话题。诞生于Google的怀抱&#xff0c;Flutter以其独特的优势和理念&#xff0c;正在引领一场全球范围内的应用开发 ** 。本文将深入探讨Flutter项目的特点、…

DM-VIO(ROS)+t265配置运行记录(ubuntu18.04+ros melodic)

在工作中需要对DM-VIO算法进行测试&#xff0c;于是配置并记录了一下&#xff1a; 首先运行ros接口的dm-vio&#xff0c;一定要先配置源码 https://github.com/lukasvst/dm-vio在这个网址把源码下载下来并解压&#xff0c;并安装一下依赖&#xff1a; sudo apt-get install …

基于Java Springboot成人教育APP且微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…

基于Java Springboot个人财务APP且微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…

PotPlayer 最新版本支持使用 Whisper 自动识别语音生成字幕

PotPlayer 最新版本支持使用 Whisper 自动识别语音生成字幕 设置使用下载地址 设置 使用 下载地址 https://www.videohelp.com/software/PotPlayer

【软考网工笔记】网络基础理论——传输层

IPSec协议 Internet协议安全性是一种开放标准的框架结构&#xff0c;通过使用加密的安全服务以确保在Internet协议&#xff08;IP&#xff09;网络上进行保密而安全的通讯。 工作在OSI模型的第三层网络层上&#xff0c;使其在单独使用时适于保护基于TCP或UDP的协议&#xff0…

代码随想录算法训练营第三十四天 | 62.不同路径 | 63. 不同路径 II | 343.整数拆分 | 96.不同的二叉搜索树

Day 34 总结 自己实现中遇到哪些困难 动态规划初始化逻辑&#xff1a;初始化哪些依赖并不存在的格子如何解决当前问题&#xff1f; 通过分解成1个&#xff0c;2个或者多个子问题如何解决子问题&#xff1f;再继续分解&#xff0c;直到要解决一个根部问题&#xff0c;通过根部问…

TinyXML2的一些用法

TinyXML2 原始字符串字面量 TinyXML21. XML文档操作1.1 LoadFile(const char* filename)1.2SaveFile(const char* filename)1.3RootElement()1.4Parse(const char* xml) 2.元素操作2.1 FirstChildElement(const char* name nullptr)2.2 NextSiblingElement(const char* name …

Fastify装饰器:增强你的路由处理功能加入日志

Fastify以其出色的性能和扩展性脱颖而出。装饰器是Fastify提供的一个强大功能&#xff0c;它允许开发者在不修改核心代码的情况下&#xff0c;向请求&#xff08;Request&#xff09;和响应&#xff08;Response&#xff09;对象添加自定义属性和方法。本文将通过一个简单的示例…

redis命令行常用的操作及数据备份

redis命令行常用的操作及数据备份 1.连接命令行2.常用的命令3.数据备份恢复4.桌面管理工具 在日常工作中&#xff0c;有时候会需要去查看redis中某个缓存key是否存在、是否过期等情况&#xff1b;因此&#xff0c;记录整理了一些常用的命令&#xff1b; 1.连接命令行 连接到re…

【大数据学习 | Spark-SQL】关于RDD、DataFrame、Dataset对象

1. 概念&#xff1a; RDD&#xff1a; 弹性分布式数据集&#xff1b; DataFrame&#xff1a; DataFrame是一种以RDD为基础的分布式数据集&#xff0c;类似于传统数据库中的二维表格。带有schema元信息&#xff0c;即DataFrame所表示的二维表数据集的每一列都带有名称和类型…

分布式集群下如何做到唯一序列号

优质博文&#xff1a;IT-BLOG-CN 分布式架构下&#xff0c;生成唯一序列号是设计系统常常会遇到的一个问题。例如&#xff0c;数据库使用分库分表的时候&#xff0c;当分成若干个sharding表后&#xff0c;如何能够快速拿到一个唯一序列号&#xff0c;是经常遇到的问题。实现思…

【算法刷题指南】优先级队列

&#x1f308;个人主页&#xff1a; 南桥几晴秋 &#x1f308;C专栏&#xff1a; 南桥谈C &#x1f308;C语言专栏&#xff1a; C语言学习系列 &#x1f308;Linux学习专栏&#xff1a; 南桥谈Linux &#x1f308;数据结构学习专栏&#xff1a; 数据结构杂谈 &#x1f308;数据…

完美解决Python项目中 ReferenceError: weakly-referenced object no longer exists 错误

问题复现 出现 E ReferenceError: weakly-referenced object no longer exists 报错 self <mysql.connector.cursor_cext.CMySQLCursor object at 0x11de2a7d0> operation \n select id, name,occupation,skills \n from resume \n where id %…

C#中的集合初始化器

C#中的集合初始化器是一种简洁的语法&#xff0c;允许在声明集合的同时初始化其元素。这种语法特别适用于初始化实现了IEnumerable接口并具有Add方法的集合类型&#xff0c;如List<T>、Dictionary<TKey, TValue>等。 集合初始化器的基本用法 集合初始化器的基本语…

【Elasticsearch】03-ES RESTFUL使用

1. Mapping操作 # 新增 PUT /hm {"mappings": {"properties": {"info": {"type": "text","analyzer": "ik_smart"},"age": {"type": "byte"},"email": {&quo…