TCP/IP详解(一)

news2024/10/7 12:25:14

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报文的可选项和填充项,以及数据位。

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

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

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

相关文章

基于stata的DID平行趋势检验

前言 DID平行趋势检验定义 定义:评估两变量数据之间是否会存在某种同幅度增减情况的相关关系检验方法 重要性:为何要做平行趋势检验?平行趋势检验在DID模型中是非常重要的一步,用于验证处理组和对照组在干预前的趋势是否平行。只…

微信服务商快速进件,商户自己提交资料,减少工作量

大家好,我是小悟 用好技术,让经营更高效。为了减少服务商工作量,移动端服务商进件来了,分为移动端和管理端。 移动端 包括四大模块,主体资料、经营资料、法人资料和银行账户。 点击顶部步骤条可以切换,…

在IDE中使用altair无法显示绘图结果

同学们以及熟悉Pycharm编辑运行python代码。正如文章末尾给出的pycharm运行altair的建议方法视觉效果一般。 因为数据可视化在IDE实现效果不理想,这是因为altair使用Vega和Vega-Lite语法来创建交互式图表,而IDE无法直接渲染这些图表。 习惯了pycharm的同学是时候考虑…

Java开发手册中为什么禁止使用BigDecimal的equals方法做等值比较以及为什么禁止使用double直接构造BigDecimal

场景 阿里Java开发手册嵩山版中明确指出: 1、BigDecimal的等值比较应使用compareTo()方法,而不是equals()方法 equals()方法会比较值和精度(1.0与1.00返回结果为false),而compareTo()则会忽略精度 2、禁止使用构造方法BigDeci…

深度学习简介

什么是深度学习? 一、深度学习–神经网络简介 深度学习(Deep Learning)(也称为深度结构学习【Deep Structured Learning】、层次学习【Hierachical Learning】或者 深度机器学习【Deep Machine Learning】)是一类算法…

CSDN送了我一本书:《写作脑科学》| 记我与写博客

文章目录 收到之前收到之后番外——我与写博客从日记开始写博客至今 收到之前 CSDN有个深读计划的活动,在报名者中抽取一些小伙伴免费送书,但是收到书籍后需要写一篇书评,否则不能继续参加下次的活动。要求写书评可能是出版社或作者希望可以…

Little’s Law 利特尔法则

1 A simple definition: Little’s Law states that the long-term average number of customers in a stable system L L L is equal to the long-term average effective arrival rate, λ \lambda λ, multiplied by the average time a customer spends in the system, …

ISO21434 网络安全验证(八)

目录 一、概述 二、目标 三、输入 3.1 先决条件 3.2 进一步支持信息 四、要求和建议 五、输出 一、概述 本条款描述了该项目的车辆级别的网络安全验证活动。该项目被考虑在车辆层面的操作环境以及系列生产的配置。 二、目标 本条款的目的是: 验证网络安全目…

软考A计划-系统架构师-官方考试指定教程-(4/15)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

建议收藏:超详细ChatGPT(GPT 4.0)论文润色指南+最全提示词/咒语

在这篇文章中,我将分享如何利用ChatGPT 4.0辅助论文写作的技巧,并根据网上的资料和最新的研究补充更多好用的咒语技巧。 本篇文章持续更新,祝大家写作顺利,如果对你有帮助,记得三连! 欢迎大家在评论区补充…

switch语句详细逆向分析

首先需要明确一点switch语句在游戏当中至关重要,而且基本都会使用它来提高效率! 因为我们在找call的时候,如果能够识别出来switch语句,只要找到一个call,后面的就都搞定了 switch:case必须是整数&#xf…

C#,码海拾贝(37)——求解“托伯利兹方程组“的“列文逊方法“之C#源代码

using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 求解线性方程组的类 LEquations /// 原作 周长发 /// 改编 深度混淆 /// </summary> public static partial class LEquations { /// <summary> /…

【高危】Linux kernel Netfilter UAF漏洞(POC公开)

漏洞描述 Netfilter 是 Linux kernel 的一个子系统&#xff0c;用于提供网络数据包过滤和网络地址转换功能。 Linux kernel 6.3.1及之前版本中&#xff0c;当 Netfilter 处理批量请求以更新 nf_tables 配置时&#xff0c;由于对匿名集合的操作处理不当会导致use-after-free&a…

【Java】Java核心要点总结:61

文章目录 1. java中的线程池是如何实现的2. 创建线程池的几个核心参数3. Java 中线程池的执行流程4. 为什么要使用线程池5. 线程池的拒绝策略 1. java中的线程池是如何实现的 Java 中的线程池是通过 ThreadPoolExecutor 类实现的。ThreadPoolExecutor 继承自 AbstractExecutorS…

chatgpt赋能python:如何快速复制Python库到其他电脑

如何快速复制Python库到其他电脑 作为一名拥有10年Python编程经验的工程师&#xff0c;我深知Python库在项目开发中扮演着非常重要的角色。Python库能够帮助我们快速实现功能、减少重复工作以及提高代码质量。但是&#xff0c;在换电脑或在新的团队合作时&#xff0c;我们常常…

【PWN · ret2libc | Canary】[2021 鹤城杯]littleof

最近比较忙&#xff0c;这道题用了好长时间来debug&#xff0c;甚至贡献了第一次在csdn上提问。。。 目录 前言 一、题目重述&思路分析 二、exp 三、Canary 四、萌新遇到的困难 总结 前言 Canary作为经典且基本的栈保护措施&#xff0c;在后期的题目中必然是基本标…

STL——string模拟实现(一)

目录 构造函数的实现 拷贝构造 赋值重载 const问题 迭代器打印 范围for打印 运算符重载 reserve模拟 插入数据 push_back append 构造函数的实现 先贴出一段错误代码&#xff1a; #include<iostream> #include<assert.h> namespace zzl//避免与库冲突 {…

Servlet 详解

目录 什么是 servlet? Servlet 是做甚的? 如何编写一个 Servlet 程序? 解析访问出错情况 Servlet 的运行原理 1. 接收请求 2. 根据请求计算响应 3. 返回响应 Servlet API 详解 HTTPServlet HttpServletRequset HttpServletResponse 什么是 servlet? Servlet 是…

String模拟实现(二)

resize resize的特点是扩容加初始化&#xff0c;如果所给的长度小于空间大小就会删除多余的数据。前面我们实现了reserve&#xff0c;但有这样一个问题&#xff0c;如果reserve的长度小于空间就会导致缩容&#xff0c;而我们知道&#xff0c;string中缩容用的是shrink_to_fit&a…

外观设计模式解读

目录 问题引进 传统方式解决影院管理 外观模式基本介绍 概念 外观模式原理类图 分类外观模式的角色 外观模式解决影院管理 传统方式解决影院管理说明 外观模式应用实例 外观模式的注意事项和细节 s统的内部细节 > 外观模式 外观模式基本介绍 概念 1) 外观模式&…