TCP/IP详解(一)

TCP/IP协议是Internet互联网最基本的协议,其在一定程度上参考了七层OSI(Open System Interconnect,即开放式系统互联)模型
OSI参考模型是国际组织ISO在1985年发布的网络互联模型,目的是为了让所有公司使用统一的规范来控制网络,让所有的公司遵循相同的通信规范,使网络能够互联互通;
OSI模型定义了网络互联的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层),每一层实现各自的功能协议,并完成与相邻层的接口通信。

TCP/IP协议中,OSI的7层被简化为4层,分别是链路层(也称为数据链路层或网络接口层)、网络层、传输层、应用层;

应用层协议:HTTPTelnetSMTPFTPDNS等;主要是为了接收来自传输层的消息,或将数据传输写入传输层;

传输层协议:TCPUDP等;主要是为了实现端对端的数据传输、传输服务分为可靠(TCP)与不可靠(UDP)、为端到端提供流量控制、差错控制、QoS(Quality of Service);

网络层协议:IPICMP(Internet Control Message Protocol)、IGMP(Internet Group Management Protocol,网络群组管理协议)等;主要是为了网络中的数据包传送;

链路层协议(又称为数据链路层或网络接口层):ARP(地址解析协议)、RARP(逆地址解析协议)等;通常包括操作系统中的设备驱动程序或计算机中对应的网络接口卡,它们一起处理与传输媒介(如电缆或其它物理设备)的物理接口细节;

每一层协议的作用

物理层:使用MAC地址解决设备身份问题;

通信工具的演变史:单根或多跟网线、集线器、交换机、路由器
单根或多跟网线:用一根网线将两台电脑连接起来就可以进行通信,至于它们为什么能够进行通信,这就涉及到操作系统方面的知识,大家有兴趣可以去了解一下IO、中断、缓冲区、以及网卡是如何转换成电信号等,或者后面我在整理一下这方面的知识。

集线器:随着越来越多的电脑设备加入,每台电脑上需要开的网口会越来越多,但是一台电脑所开的网口有限,不可能无限增加网口,于是就出现了集线器,即中间器。将每一台电脑的网线插入这个集线器,由这个设备进行转发,这样每台设备就可以彼此进行通信。这种集线器的通信模式本质上与单根或多根网线的通信方式是一样的,只是每台电脑的网口数量减少了。

集线器仅仅是电脑将电信号转发到所有出口(广播),对转发消息不做任何处理。如,在A向B发送数据时,只需要在数据包头部提供源MAC地址和目标MAC地址,当B收到数据包后,只需根据数据包头部的目标MAC地址判断是否是发送给自己的,而其它设备在收到数据包后,也是一样通过从数据包头部的目标MAC地址判断是否发送给自己的,如果目标MAC地址与自己的MAC地址不一致,便丢弃该数据包。

虽然集线器使整个布局变得简洁,但是从A发到B的数据,会将数据包发给所有连接该集线器的设备,容易造成数据的安全性问题,而且也容易浪费网络资源。

那么,假如是否存在一种设备,能够将数据只发送给B设备呢?

交换机:为了解决集线器的问题,将消息只发送给目标MAC地址所指向的设备,该设备放在数据链路层。
交换机内部维护着一张MAC地址表,记录着每一台设备的MAC地址,同时也记录着该设备连接在哪一个端口上。假设A设备发送数据到B设备,当数据包到达交换机时,交换机通过查内部维护的MAC地址表,发现B设备的MAC地址为XXXX,在1号端口上,于是交换机将数据包从1号端口发送到B设备,通过这种传输方式而组成的小范围网络,我们称之为以太网。

当然,MAC地址表刚开始建立时是空的,当你向B设备发送消息时,A设备的消息从端口1发出,此时交换机将A设备的MAC地址和端口号记录到交换机内部映射表中,当交换机在内部映射表中查不到B设备的MAC地址和端口号时,会将此数据包发送给所有端口,即发给了所有设备,当只有机器B收到数据是发送给自己时,于是做出响应,响应码从3号端口发出进入交换机,此时交换机会在MAC地址表中更新B设备的MAC地址和端口。当该网络中的机器不断通信时,交换机中的MAC地址表会不断完善。

但是,随着网络中的设备数量越来越多,交换机内部需要维护的MAC地址数量也越来越多,交换机的端口数量会出现不足。

此时交换机已经无法满足如此庞大的映射关系。

路由器:作为一台独立的拥有MAC地址的设备,并且可以把数据包做一次转发(注意:路由器的每个端口都拥有独立的MAC地址);路由器是属于网络层。路由器专门负责IP地址的寻找。

有了路由器,自然而然就诞生了IP地址,IP地址长度为32位,而MAC地址长度为48位;

当A设备与C设备不在同一个子网时,A设备会将数据包发送给路由器,然后由路由器进行转发;

但是,A设备是怎么知道和C设备不在同一个子网,以及A如何知道那台设备是路由器?

这时就诞生了子网和网关

子网得由来:
A给C发送数据,怎么知道是否要通过路由器进行转发?答案是通过子网
目的IP和源IP处于同一个子网,直接通过交换机进行转发;
目的IP和源IP不处于同一个子网,就交给路由器去进行处理;

假入某台子网掩码定义为255.255.255.0
将源IP和目的IP分别与这个子网掩码进行与运算,相等则是在一个子网,不相等就是在不同的子网。例如,对于192.168.0.1来说,192.168.0.xxx就算是在一个子网,否则就是在不同子网。
比如:
A电脑:192.168.0.1&255.255.255.0 = 192.168.0.0
B电脑:192.168.0.3&255.255.255.0 = 192.168.0.0
C电脑:192.168.2.1&255.255.255.0 = 192.168.2.0
D电脑:192.168.2.6&255.255.255.0 = 192.168.2.0
那么A与B在同一个子网,C与D在同一个子网,但是A与C和D不在同一个子网;
默认网关(如192.168.0.254),当A与C不在一个子网时,A会将包发送到同一子网下的默认网关,至于是那台设备,A不在关心,只需发出即可。

子网掩码其实就是表示前多少位为子网网段,如192.168.0.0(255.255.255.0),可以简写为192.168.0.0/24;
在这里插入图片描述
当A向C传输数据时,除了加上数据链路层的头部之外,还要在增加一个网络层的头部;
A发送给路由器的信息如下:
在这里插入图片描述
路由器发送给C的信息如下:
在这里插入图片描述
至于上述过程的发送流程为什么是这样,与前面讲到的子网有关系,理解了子网的概念,就明白了A到C的发送过程;
至于路由器怎么知道收到的这个数据包该从自己的那个端口出去呢?
答案是路由器中也维护着一张路由表,与MAC地址表一样。不同于MAC地址的是,路由表并不是一对一的确定关系;
在这里插入图片描述
由于子网掩码其实就是表示前多少位表示子网网段,如192.168.0.0(255.255.255.0)也可以简写为192.168.0.0/24;
在这里插入图片描述
于是,路由表就表示,192.168.0.XXX的都发送到0好端口,192.168.1.XXX的都发送到1号端口,上图中下一跳暂时没有值,可以先忽略;
这样我们从A发送到C的数据,就能够正常发出;

但是,现在又有一个问题,发送数据还需要数据链路层的包,而我们只知道IP地址,数据是怎么发送出去的呢?

答案是ARP协议,在网络层中,通过IP地址找到对应设备的MAC地址,同时电脑A和C都会缓存一张ARP缓存表,记录着IP与MAC地址的对应关系;

刚开始的时候,ARP缓存表是空的,A为了知道C的MAC地址,将会广播一条ARP请求,C收到该请求后,将会发送自己的MAC地址和响应码,A收到后便更新了自己的ARP缓存表。

通过这种方式不断的进行广播ARP请求,最终电脑里面的ARP缓存表都将会更新完整;

上面讲到的MAC地址表、路由表、ARP缓存表,这三张表是怎么来的呢?

MAC地址表:以太网内各节点之间不断通过交换机通信,逐步进行完善;用于映射MAC地址和它的端口号;
路由表:路由算法+人工配置逐步完善;用于映射IP地址和它的端口号;

ARP缓存表:通过ARP协议广播请求逐步完善;电脑和路由器中都有ARP缓存表,用于IP地址和MAC地址的映射关系;

HTTP报文传输原理

利用TCP/IP进行网络通信时,数据包会按照分层顺序与对方进行通信。发送端从应用层往下走,接收端从链路层往上走。从客户端到服务端的数据,每一帧的数据传输顺序为:应用层–>传输层–>网络层–>链路层–>链路层–>网络层–>传输层–>应用层;
在这里插入图片描述
TCP协议的报文格式
TCP/IP协议栈中,IP协议层只关心如何使数据传输跨越本地网络的边界问题,而不关心数据是如何传输。整体的TCP/IP协议栈,共同配合解决数据如何通过许多个点对点通路,顺利传输到达目的地。一个点对点通路被称为一跳(hop),通过TCP/IP协议栈,网络成员能够在许多“跳”的基础上建立相互的数据通路。
传输层TCP协议提供一种面向连接的,可靠的字节流服务,其数据帧格式如下图所示:
在这里插入图片描述
TCP协议的数据帧,大致分为以下几个部分:
源端口:源端口表示报文的发送端口,占16位。源端口和IP地址组合起来,可以标识报文的发送地址;
目的端口:目的端口表示报文的接收端口,占16位。目的端口和IP地址组合起来,可以标识报文的接收地址;
序号:TCP传输过程中,发送端发出的字节流中,传输报文的数据部分的每一个字节都有它的编号。序号占用32位,即4个字节,发送方发送数据时,都需要标记序号。

序号与SYN控制标志的值相关,根据控制标志中的SYN是否为1,序号表达的含义不同:
(1)当SYN=1时,当前为连接建立阶段,此时的序号为初始序号ISN,通过算法来随机生成序号;
(2)当SYN=0时,在数据传输开始时,第一个报文的序号为ISN+1,后面的报文序号为前一个报文的SN值+TCP报文的净字节数(不包含TCP头)。例如,如果发送端发送的一个TCP帧的净荷为16byte,序号为6,则发送端在发送下一个数据包时,序号应设置为:16 + 6 = 22;

在数据传输过程中,TCP协议通过序号对上层提供有序的数据流。发送端可以根据序号来跟踪发送的数据量,接收端可以根据序号来识别重复的TCP包,从而将重复的TCP包丢弃,对于乱序的数据包,接收端可以根据序号进行排序。

确认序号:标识报文接收端期望接收的字节序列。如果设置了ACK控制位,确认序号的值表示一个准备接收的包的序列码,它所指向的是准备接收的数据包,也就是下一个期望接收的包的序列码;
假设发送端发送6个净荷为1024byte,起始SN号为1的数据包给服务端,服务端每收到一个包之后,需要回复一个ACK响应,确认数据包给发送端,ACK响应数据包的ACK值为每个发送端包的SN+包净荷,表示服务端已经接收到的字节数,还表示期望收到下一个发送端发送数据包的SN序号。
在这里插入图片描述
只有控制标志的ACK标志为1时,数据帧中的确认序号ACK序号才有效。TCP协议规定,在建立连接后,所有发送报文的ACK值必须为1,所有报文的确认序号有效。如果是SYN类型的报文,ACK标志为0,没有确认序号。

头部长度:该字段占用4位,用来表示TCP报文的首部长度;其值所表示的并不是字节数,而是头部的所含有的32bit的数目(或者倍数),或者4个字节的倍数,所以TCP头部最多可以有60字节(4*15=60)。没有任何选项字段的TCP头部长度为20字节,所以其头部长度为5,可以通过20/4=5计算得到。

预留6为:头部长度后面预留的字段长度为6位,作为保留字段,暂时没有什么用处。
控制标志:控制标志(Control Bits)共6个bit位,具体的标志位为:URG、ACK、PSH、RST、SYN、FIN
窗口:长度为16为,共2个字节。此字段用来进行流量控制,流量控制的单位为字节数,表示接收方一次希望收到的字节数;

校验和:长度为16位,共2个字节。对整个TCP报文段和数据进行校验和计算,接收端用于对收到的数据包进行验证;

紧急指针:长度为16为,共2个字节。它是一个偏移量,与SN序号值相加表示紧急数据最后一个字节的序号;
以上是TCP协议报文首部必须需要的字段,也称固有字段,长度为20个字节,后面的为TCP报文的可选项和填充项,以及数据位。

暂时先写到这里,内容太多,一次讲不完,下次再继续更新。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

序列化和反序列化的认识【protobuf、json、xml】

1. 什么是序列化与反序列化? 程序员在编写应用程序的时候往往需要将程序的某些数据存储在连续的内存中,然后将其写入文件或是将其传输到网络中的另一台计算机上以实现通讯。这个将程序数据转换成能被存储并传输的格式的过程被称为序列化(seri…

web存储(Storage)

目录 1、基本概念 2、功能监测 2.1 测试可用性 2、W3C标准 3、基本方法或属性 4、 Local Storage 4.1 描述 4.2 示例 5、sessionStorage 5.1 描述 5.2 示例 6、StorageEvent(存储事件) 6.1 构造函数 6.2 实例属性 6.3 实例方法 6.4 响应…

【spring源码系列-04】注解方式启动spring时refresh的前置工作

Spring源码系列整体栏目 内容链接地址【一】spring源码整体概述https://blog.csdn.net/zhenghuishengq/article/details/130940885【二】通过refresh方法剖析IOC的整体流程https://blog.csdn.net/zhenghuishengq/article/details/131003428【三】xml配置文件启动spring时refres…

团体程序设计天梯赛-练习集L2篇⑨

🚀欢迎来到本文🚀 🍉个人简介:Hello大家好呀,我是陈童学,一个与你一样正在慢慢前行的普通人。 🏀个人主页:陈童学哦CSDN 💡所属专栏:PTA 🎁希望各…

线性代数高级--矩阵的秩--SVD分解定义--SVD分解的应用

目录 矩阵的秩 概念 k阶子式 矩阵的秩的定义 矩阵的秩的性质 SVD分解 概念 注意 SVD的分解过程 SVD分解的应用 矩阵的秩 概念 矩阵的秩是线性代数中的一个重要概念,用于描述矩阵的行(或列)向量的线性无关程度。矩阵的秩可以通过…

Spring Data JPA 报 HOUR_OF_DAY: 0 -> 1异常的解决过程和方案

在进行数据查询时,控制台报了Caused by: com.mysql.cj.exceptions.WrongArgumentException: HOUR_OF_DAY: 0 -> 1异常,查询得知:这是由于查mysql库,转换类型为datetime类型的字段引起的。 网上的解决方案有多种,大…

fastadmin如何自定义一个列表上的按钮。

参考文档: 首先,这是没有新增按钮的,只有删除和编辑。 然后js按钮是这一块: 我现在呢想加上一个撤销的按钮怎么办呢,只需要在js加上这一串代码就行了。 {field: "operate",title: __("Operate")…

uni-app 使用axios发请求 运行到微信开发者工具报错 Adapter “http‘ is not available in the build

场景 最近在使用uni-app开发H5移动端,跟往常一样使用axios发请求,做一些全局的请求拦截响应拦截操作 uni-app数据存储,uni-ui组件开发,配置axios,vuex。配置了vue.config.js文件做跨域操作 运行到谷歌浏览器一切正常…

HBase(8):扫描操作

1 需求 查看ORDER_INFO表中所有的数据 1.2 scan命令 在HBase,我们可以使用scan命令来扫描HBase中的表。语法: scan 表名 1.3 扫描ORDER_INFO表 scan ORDER_INFO,{FORMATTER => toString} 注意:要避免scan一张大表! 2 需求二:查询订单数据(只显示3条) scan ORDE…

从0开始,精通Go语言Rest微服务架构和开发

说在前面 现在拿到offer超级难,甚至连面试电话,一个都搞不到。 尼恩的技术社区中(50),很多小伙伴凭借 “左手云原生右手大数据”的绝活,拿到了offer,并且是非常优质的offer,据说年…

响应式数据大屏开发rem、%、vh/vm

前言 响应式数据大屏开发rem、%、vh/vm 我们在开发数据大屏的时候难免会需要解决响应式问题 ,那么响应式是什么呢? 响应式:响应式布局是元素随着屏幕发生宽高大小变化 盒子布局发生变化 通俗的来说: 自适应:元素随着…

尚硅谷大数据Flink1.17实战教程-笔记02【Flink部署】

尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】视频地址:尚硅谷大数据Flink1.17实战教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据Flink1.17实战教程-笔记01【Flink概述、Flink快速上手】尚硅谷大数据Flink1.17实战教程-笔记02【Flink部署】尚硅谷…

深入理解深度学习——Transformer:编码器(Encoder)部分

分类目录:《深入理解深度学习》总目录 相关文章: 注意力机制(AttentionMechanism):基础知识 注意力机制(AttentionMechanism):注意力汇聚与Nadaraya-Watson核回归 注意力机制&#…

Unix/Linux编程:UDS 流(Stream)

〇、前言 socket 是一种 IPC (Inter-Process Communication,进程间通信)方法,它允许位于同一主机(计算机)或使用网络连接起来的不同主机上的应用程序之间交换数据。通过使用Socket,开发人员可以…

HTML5 游戏开发实战 | 贪吃蛇

在该游戏中,玩家操纵一条贪吃的蛇在长方形场地里行走,贪吃蛇按玩家所按的方向键折行,蛇头吃到食物(豆)后,分数加10分,蛇身会变长,如果贪吃蛇碰上墙壁或者自身的话,游戏就结束了(当然也可能是减去…

企业级微服务架构实战项目--xx优选-用户登录

一 用户登录的触发页面 1.登录常量 2.登录地址 3.配置域名 4.启动程序 触发连接小程序后端的登录接口 小程序controller的登录方法

XR云新未来圆桌精彩回顾 | XR应用场景迭代下的新商业模式

6月15日,由平行云联合首都在线共同主办,中关村软件园协办,以“XR云新未来|弹性算力赋能可交互、沉浸式商业实践”为主题的XR行业交流盛会在北京成功举办。 本次会议我们邀请到平行云科技创始人兼CEO 李岩、XREAL 云XR负责人 吴维、瑞帆科技…

利用SQL注入漏洞登录后台

所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQ…

LLM-Client一个轻量级的LLM集成工具

大型语言模型(llm)已经彻底改变了我们与文本交互的方式,OpenAI、Google、AI21、HuggingfaceHub、Anthropic和众多开源模型提供了不同的功能和优势。但是每个模型都有其独特的体系结构、api和兼容性需求,集成这些模型是一项耗时且具有挑战性的任务。 所以…

【spring cloud学习】4、创建服务提供者

注册中心Eureka Server创建并启动之后,接下来介绍如何创建一个Provider并且注册到Eureka Server中,再提供一个REST接口给其他服务调用。 首先一个Provider至少需要两个组件包依赖:Spring Boot Web服务组件和Eureka Client组件。如下所示&…