tcp/ip协议详解

2023-11-11

1、TCP/IP协议族是一个四层协议系统,自低而上分别是数据链路层、网络层、传输层、应用层。
在这里插入图片描述
(1)数据链路层:实现了网卡接口的网络驱动程序,以处理数据在物理媒介上的传输。
ARP协议:将目标机器的IP地址转换为其物理地址。(数据链路层使用物理地址寻址一台机器)
RARP协议:仅用于网络上的某些无盘工作站。

(2)网络层:实现数据包的选路和转发。
IP协议:IP协议根据数据包的目的IP地址来决定如何投递它。如果数据包不能直接发送给目的主机,那么IP协议就为它寻找一个适合的下一跳路由器,并将数据包交付给该路由器来转发。多次重复这一过程,数据包最终到达目的主机,或者由于发送失败而被丢弃。(IP协议使用逐跳的方式来确定通信路径。)
ICMP协议:它是IP协议的重要补充,主要用于检测网络连接。ICMP报文分为两大类:①差错报文 ②查询报文。

(3)传输层:为两台主机上的应用程序提供端到端的通信。传输层是关心通信的起始端和目的端。
在这里插入图片描述
传输层协议主要有三个:①TCP协议 ②UDP协议 ③ SCTP协议
①TCP协议:为应用层提供可靠的、面向连接的和基于流的服务。TCP协议使用超时重传、数据确认等方式来确保数据包被正确地发送给目的端(因此TCP服务是可靠的)。使用TCP协议的通信双方必须先建立TCP连接,并在内核中为TCP连接维持一些必要的数据结构,比如连接的状态、读写缓冲区,以及诸多定时器等。当通信结束时,双方必须关闭连接以释放这些内核数据。TCP服务是基于流的。基于流的数据是没有边界限制的,它源源不断的从通信的一段流入另一端。发送端可以逐个字节地向数据流中写入数据,接收端也可以逐个字节流地将他们读出。
②UDP协议(用户数据报协议):为应用层提供不可靠、无连接和基于数据报的服务。“不可靠“:无法保证数据正确的从发送端到目的端。如果数据在中途丢失,或者目的端通过数据校验发现数据错误将其丢失,而UDP只是简单的通知应用程序发送失败。因此,使用UDP协议的应用程序通常要自己处理超时重传、数据处理等逻辑。UDP协议是无连接的,即通信双方不保持一个长久的联系,因此应用程序每次发送数据都要明确的指出接收端地址。基于数据包服务,是对于流服务而言。每个UDP数据包都有一个长度,接收端必须以该长度为最小单位将其内容一次性读出,否则数据将被截断。
③SCTP协议(流控制传输协议):在因特网上传输电话信号而设计的。

(4)应用层:负责处理应用程序的逻辑(用户空间实现)。数据链路层、网络层和传输层负责处理网络通信细节(在内核空间实现)。
①ping是应用程序,利用ICMP检测网络连接,是调试网络的必备工具。
②telnet协议是一种远程登录协议。
③OSPF协议是一种多态路由更新协议,用于路由器之间的通信,以告知对方各自路由的信息。
④DNS协议通过机器域名到IP地址的转换。
应用层协议可能跳过传输层直接使用网络层的服务。

2、封装:应用程序数据在发送到物理网络之前,将沿着协议栈从上往下依次传递,每层数据都在上层协议的基础上加上自己的头部信息,以实现该层功能。
在这里插入图片描述
经过TCP封装后的数据称为TCP报文段(TCP段)。前文提到,TCP协议为通信双方维持的一个连接,并在内核中处理相关数据。这部分数据中的TCP头部信息和TCP内核缓冲区的数据一起构成TCP报文段。
在这里插入图片描述
当发端向一个TCP连接写入数据时,TCP模块首先把数据复制到与该连接对应的内核缓冲区,然后TCP模块调用IP模块提供服务,传递参数包括TCP头部信息和TCP发送缓冲区的数据(TCP报文段)。

经过UDP封装后的数据交UDP报文段。当一个UDP数据报被发送成功之后,UDP内核缓冲区的数据就被丢弃了。如果应用程序检测到该数据报未能被接收端正确接收,并打算重新发送这个数据,则应用程序需要重新从用户空间将数据拷贝到UDP内核发送缓冲区中。

经过数据链路层封装的数据为帧。(帧才是最终在物理网络上传送的字节序列。至此,封装过程完成。)
在这里插入图片描述

3、分用
分用:当帧到达目的主机时,将沿着协议栈自底向上依次传递。各层协议依次处理帧中本层负责的头部数据,以获取所需信息,并将处理后的帧交给目的应用程序。
在这里插入图片描述
IP协议、ARP协议和RARP协议使用2字节的类型字段来标识上层协议。

ICMP协议、TCP协议和UDP协议都使用IP协议,所以IP数据报的头部采用16位的协议的协议字段来区分他们。

TCP报文段和UDP报文段则通过其头部16位的端口号字段来区分上层应用程序。

帧通过上述分用步骤后,最终将封装前的原始数据送至目的服务。

4、测试网络
该测试网络主要用于分析ARP协议、IP协议、ICMP协议、TCP协议和DNS协议。我们通过抓取该网络上的以太网帧,查看其中的以太网帧头部、IP数据报头部、TCP报文段头部信息,以获取网络通信的细节。
在这里插入图片描述

5、ARP协议工作原理
ARP协议能实现任意网络层地址到任意物理地址的存在。
工作原理:主机向自己所在的网络广播一个ARP请求,该请求包含目标机器的网络地址,此网络上的其他机器都会收到这个请求,但只有被请求的目标机器会回应一个ARP应答,其中包含自己的物理地址。
(1)以太网ARP请求/应答报文详解
ARP请求/应答报文长度为28个字节。
在这里插入图片描述
硬件类型字段定义物理地址类型,值为1表示MAC地址。
协议类型字段表示要映射的协议地址类型,值为0x800,表示IP地址。
硬件地址长度和协议地址长度(单位:字节),对于MAC地址来说 ,其长度为6;对IP(v4)地址来说,其长度为4。
操作字段指出4种类型:ARP请求(值为1)、ARP应答(值为2)、RARP请求(值为3)、RARP应答(值为4)。
最后4个字段指通信双方的以太网地址和IP地址。

(2)ARP高速缓存的查看和修改
ARP维护一个高速缓存,其中包含经常访问或最近访问的机器的IP地址到物理地址的映射。这样避免了重复的ARP请求,提高了发送数据报的速度。

(3)ARP通信过程
ARP请求和应答是从以太驱动程序发出的。
在这里插入图片描述
6、DNS工作原理
DNS是一套分布式的域名服务系统。
我们通常使用机器的域名来访问这台机器,而不是直接访问其IP地址。
(1)DNS查询和应答报文详解
每个DNS服务器上都存在着大量的机器名和IP地址的映射,并且是动态更新的。众多网络客服端程序都是用DNS协议来向DNS服务查询目标主机的IP地址。
DNS查询和应答报文的格式:
在这里插入图片描述
16位标识字段用于标记一对DNS查询和应答,以此区分一个DNS应答是哪个DNS查询的回应。
16位标志字段用于协商具体的通信方式和反馈通信状态。

Linux下访问DNS服务:首先我们必须先知道DNS服务器的IP地址。Linux使用/etc/resolv.conf文件来存放DNS服务器的IP地址。

7、soncket和TCP/IP协议族的关系
前文提到,数据链路层、网络层、传输层协议都在内核中实现。因此操作系统需要实现一组系统调用,使得应用程序能使用这些协议提供的服务。实现这组系统调用的API(应用程序编程接口)主要有两套:socket和XTI。
由socket定义的这一组API提供两个功能:
①将应用程序数据从用户缓冲区中复制到TCP/UDP内核发送缓冲区,以交付内核来发送数据,或者从内核TCP/UDP接收缓冲区中复制数据到用户缓冲区,以读取数据。
②应用程序可以通过它们来修改内核中各层协议的某些头部信息或者其他数据结构,从而精细的控制底层通信的行为。比如可以通过setsockopt函数来设置IP数据报在网络上的存活时间。
socket是一套通用网络接口,它不但可以访问内核中TCP/IP协议栈,而且可以访问其他协议栈。

IP协议详解

ip协议是TCP/IP协议的核心,也是socket网络编程的核心之一。
IP头部信息:IP头部信息出现在每个IP数据报中,用于指定IP通信的源端IP地址、目的端IP地址,指导IP分片和重组,以及指定部分通信行为。
IP数据报的路由和转发:IP数据报的路由和转发发生在除目标机器之外的所有主机和路由器上。它们决定数据包是否要转发以及如何转发。

(1)IP服务特点
IP协议是TCP/IP协议族的动力,它为上层协议提供无状态、无连接、不可靠的服务。

无状态:是指IP双方不同步传输数据的状态信息,因此所以数据包的传输和接收都是相互独立的,没有上下文关系。面向连接的协议,比如TCP协议,则能够自己处理乱序的、重复的报文段,它递给上层协议的内容绝对是有序的、正确的。
缺点:无法处理乱序和重复的IP数据报。
优点:简单、高效。

无连接:IP双方都不能长时间的维持对方的任何信息。上层协议每次要发送数据的时候,都要明确指出对方IP地址。

不可靠:是指IP协议不能确保IP数据包能准确的到达接收端。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

tcp/ip协议详解 的相关文章

  • 将 Uploadify 与 Sharepoint 和 .net 结合使用

    我在共享点页面上有一些由 JQuery 生成的 html 我想在这个 html 中使用 uploadify 将文件上传到服务器 亚历山大 https stackoverflow com users 25427 alexander gyosh
  • 如何使用 ASP.NET MVC 4.0 DonutOutputCache VaryByCustom 使缓存失效

    我正在为我的 ASP NET 应用程序使用 DevTrends MvcDonutCaching 包 它工作得很好 我目前遇到的一个问题是使我为子操作设置的 VaryByCustom 缓存无效 这是我用于 VaryByCustom 设置的一些
  • 输入号码时自动格式化 SSN

    我有一个文本字段 用户输入 SSN 号码 输入自身时 它应该格式化 就像关于文本字段的更改 它应该格式化999 999 999以这种方式在显示器本身上 kottenator 的脚本几乎已经完成 但它每隔 3 位数字就中断该值 而不是 3 位
  • 如何列出特定服务器的所有成员?

    我的代码是 const list client guilds find id 335507048017952771 for user of list users console log user 1 username 这实际上没有任何作用
  • bootstrap-datetimepicker 仅显示日期

    我正在用这个repo https github com smalot bootstrap datetimepicker由 smalot 提供 我只想选择并显示日期 对于其他一些地方 我显示数据和时间 因此选择此存储库 我可以设法仅使用它来选
  • MSBuild 将动态生成的文件复制为项目依赖项的一部分

    我有一个自定义 msbuild 任务 它正在生成一些输出文件到 ProjectA 的输出目录 TargetDir 当前的代码是这样的
  • 如何控制谷歌地图标记的不透明度

    我需要根据时间使一些标记半透明 有什么方法可以控制标记的 CSS 不透明度吗 或者是否可以可靠地找出标记的 DOM 元素 我使用 Google 地图 API v3 标记的不透明度可以设置为marker setOptions opacity
  • XPath 选择具有特定属性值的元素?

    我在使用 XPath 选择节点时遇到问题 我将展示一个示例 由于实际数据量很大 xml 文件被缩短了 这是 XML 的子集
  • 如何定义 Swagger UI 参数的默认值?

    我已将 Swagger Swashbuckle 集成到 NET Core 2 2 API 项目中 一切都很好 我的要求纯粹是为了方便 考虑以下 API 方法 public Model SomeEstimate SomeRequest req
  • System.Drawing.Icon 构造函数抛出“操作成功完成”异常

    在 Windows XP 计算机上 以下代码抛出 System ComponentModel Win32Exception 并显示消息 操作成功完成 System Drawing Icon icon new System Drawing I
  • g++4.9 不支持 std::align

    在学习对齐问题等时 我意识到我的 g 4 9 macports OS X 实现不支持std align 如果我尝试编译 使用 std c 11 此示例代码来自http www cplusplus com reference memory a
  • 为 C++ 类播种 rand()

    我正在开发一个 C 类 它使用rand 在构造函数中 我真的希望这个班级在几乎所有方面都能照顾好自己 但我不知道在哪里播种rand 如果我播种rand 在构造函数中 每次构造我的对象类型的新实例时都会对其进行播种 因此 如果我按顺序创建 3
  • javascript初学者:在javascript中添加动态样式? [复制]

    这个问题在这里已经有答案了 可能的重复 如何使用 Javascript 创建 标签 https stackoverflow com questions 524696 how to create a style tag with javasc
  • Python 中的 C 指针算术

    我正在尝试将一个简单的 C 程序转换为 Python 但由于我对 C 和 Python 都一无所知 这对我来说很困难 我被 C 指针困住了 有一个函数采用 unsigned long int 指针并将其值添加到 while 循环中的某些变量
  • 可选参数代码在 .NET 3.5 中编译。为什么?

    这段代码在 VS 2010 的框架 3 5 项目中编译正常 我三次检查过 public LoggingClient string uri net msmq localhost logging 为什么 我在 C 4 规范中没有看到任何内容 文
  • JavaScript:如何在 Internet Explorer 中模拟更改事件(委托)

    UPDATE 回顾 小提琴和赏金 这个问题并没有引起太多关注 所以我将花一些时间来解决这个问题 我知道我的答案和问题都过于冗长 这就是为什么我继续设置这把小提琴 http jsfiddle net vVA8N 在我看来 这是我目前必须用来接
  • MsBuild 在 Visual Studio Online 上找不到恢复的 NuGet 包

    我尝试构建一个存储在 Visual Studio Online 上的外部 GIT 存储库中的解决方案 它有以下步骤 1 Git 恢复 有效 2 NuGet 恢复 有效 3 构建 不起作用 查看日志时我的第一个猜测是 MsBuild 没有查找
  • 从哪里开始阅读 SQLite 源代码? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想了解sqlite是如何实现的 并且 想阅读源代码 我已经下载了源代码 我应该开始查看代码的哪一部分 SQLite文档页 http
  • 使用 Javascript 删除字符串的最后一个字符

    我有一个DIV与一些字符 如何在每次单击时删除文本中的最后一个字符DIV itself 删除第一个字符 div on click function this text function index text return text repl
  • GetActiveObject() 与 GetObject() -- MK_E_UNAVAILABLE 错误

    All 我在将一些 VBA 代码转换为 C 时遇到一些问题 我们有一个充当本地 COM 服务器的第 3 方应用程序 在我们使用的VBA代码中获取对象 获取对现有对象的引用 e g Set appHandle GetObject ProgId

随机推荐

  • LeGO-LOAM论文翻译(内容精简)

    LeGO LOAM是一种在LOAM之上进行改进的激光雷达建图方法 建图效果比LOAM要好 但是建图较为稀疏 计算量也更小了 本文原地址 wykxwyc的博客 github注释后LeGO LOAM源码 LeGO LOAM NOTED 关于代码
  • C++类的介绍

    最近在学习SLAM 顺便将C 类的知识复习一下 其中部分官方定义和程序设计方法来源于西北工业大学魏英老师 1 类的定义 是用户自定义的数据类型 C 一个类定义的形式如下 class 类名 成员列表 成员列表是类成员的集合 数目可以任意多 一
  • “三国演义”何处去

    作者 朱金灿 来源 http blog csdn net clever101 微软资深副总裁张亚勤在2011移动开发者大会的演讲 移动互联的新趋势 这样描述当前的移动操作系统的分布趋势 随着Windows Phone的推出 移动平台市场渐成
  • 【Mac】mac 安装Axure RP 8 点不开 就一直跳-后闪退-报错Expected an Int64 but got a System.UInt64

    1 美图 2 概述 2 1 闪退 先确保软件已安装到 应用程序 中 比如 CleanMyMac X 软件闪退 就输入以下命令然后回车即可 如下图 codesign f s deep Applications CleanMyMac X app
  • C语言中循环结构1(求和)思路

    题目描述 求S a aa aaa aa aaa 有n个a 之值 其中a是一个数字 例如 2 22 222 2222 22222 n 5 a 2 a和n由键盘输入 思路 C语言中一个简单的循环 循环次数 循环后的sum 每循环一次 a扩大10
  • JavaWeb问题集锦: 数据库连接池请求超时 HikariPool-1 - Connection is not available, request timed out after 30000ms

    报错日志 java sql SQLTransientConnectionException HikariPool 1 Connection is not available request timed out after 30000ms 原
  • 机器学习-集成学习-梯度提升决策树(GBDT)

    目录 1 GBDT算法的过程 1 1 Boosting思想 1 2 GBDT原理 需要多少颗树 2 梯度提升和梯度下降的区别和联系是什么 3 GBDT的优点和局限性有哪些 3 1 优点 3 2 局限性 4 RF 随机森林 与GBDT之间的区
  • 更换编译器,CODE::BLOCKS 无法DEBUG 至断点

    想在LINUX下使用CODE BLOCKS 编写调试并编译连接ARM运行程序 IDE编译环境默认为 GNU GCC 编译器 修改如下 1 至Settings gt Compiler and debugger settings 将Setect
  • 互联网摸鱼日报(2023-04-19)

    互联网摸鱼日报 2023 04 19 InfoQ 热门话题 传统网关的云原生策略 InfoQ 极客有约 华为发布高阶智能驾驶系统 ADS 2 0 百度发布旗舰产品城市智驾 Apollo City Driving Max 小鹏汽车发布 SEP
  • STM32的FSMC

    FSMC之LCD彩屏学习 彩屏的驱动这里主要用到的是8080并口接口 彩屏这里有区分带有控制器和不带控制器的 80并口有如下一些信号线 CS 片选信号 WR 写数据 RD 读数据 RST 复位 RS 命令 数据标志 0 读写命令 1 读写数
  • linux常用命令整理篇4:关于tomcat的一些命令

    1 查看是否安装了 rpm qa grep tomcat 2 查看tomcat进程ID ps ef grep tomcat 3 杀死tomcat进程 kill 9 进程ID 4 查看tomcat目录 find name tomcat 5 启
  • 云笔记的使用感受和选择

    市场上有很多文章针对云笔记的选择 但经过下载发现可能存在很多虚假广告 求生欲 其实可能是个人使用感受不佳仅表示个人观点 为什么选择云笔记 个人比较喜欢 记录学习笔记和生活中的东西 之前选择有道云笔记 但因为最近打开的时候突然服务器挂了 登录
  • 【HIT-计算机系统】ICS-Lab8 Dynamic Storage Allocator

    第1章 实验基本信息 1 1 实验目的 理解现代计算机系统虚拟存储的基本知识 掌握C语言指针相关的基本操作 深入理解动态存储申请 释放的基本原理和相关系统函数 用C语言实现动态存储分配器 并进行测试分析 培养Linux下的软件系统开发与测试
  • 30分钟部署一个kubernetes集群【1.15】

    作者 李振良 kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具 这个工具能通过两条指令完成一个kubernetes集群的部署 创建一个 Master 节点 kubeadm init 将一个 Node 节点加入到当
  • 解决window平台下的.ssh/id_rsa bad permission问题

    参考链接 https www cnblogs com clblacksmith p 11677135 html
  • 解决问题:List集合add元素,添加多个对象出现重复的问题

    首先我们在new 一个对象的时候 对象的id是唯一确定的 将对象add入list中时 放入list中的其实是对象的引用 而每次循环只是简单的set 对象的属性 set新的属性值 而add进list中的对象还是同一个对象id 也就是同一个对象
  • 渗透必备工具-BurpSuite

    目录 介绍 爆破 解码 BurpSuite burpsuite基本可以说是渗透的必备工具 用起来也很简单 方便 通常使用它可以进行一些截包分析 修改包数据 暴力破解 扫描等很多功能 用得最多的应该是开代理截包分析数据和爆破 解码 加密 bu
  • Ubuntu 22.04 LTS root登录、修改当前用户名和主机名

    前言 Ubuntu 22 04 默认不开启root用户 配置操作 1 开启 root 以普通用户登录系统 创建root用户的密码 opt opt sudo passwd root SSH 放行 opt opt sudo sed i s Pe
  • jeecgboot 上传文件

    jeecgboot框架中文件上传接口 jeecg boot sys common upload 支持本地上传 配置云上传等多种方式上传文件 local为本地存储 还需要配置jeecg path upload minio为使用MinIO线上存
  • tcp/ip协议详解

    1 TCP IP协议族是一个四层协议系统 自低而上分别是数据链路层 网络层 传输层 应用层 1 数据链路层 实现了网卡接口的网络驱动程序 以处理数据在物理媒介上的传输 ARP协议 将目标机器的IP地址转换为其物理地址 数据链路层使用物理地址