TCP/IP协议族之TCP、UDP协议详解(小白也能看懂)

news2024/11/15 22:47:31

前言

        在进行网络编程之前,我们必须要对网络通信的基础知识有个大概的框架,TCP/IP协议族涉及到多种网络协议,一般说TCP/IP协议,它不是指某一个具体的网络协议,而是一个协议族。本篇章主要针对IP协议、TCP和UDP协议记录总结。

1. 分层模型

1.1 OSI模型标准

OSI七层参考模型是国际标准化组织(ISO)制定的一个用于通信系统间网络互联的标准体系,称为OSI参考模型或七层模型。下面对七层模型简单介绍:

1.1.1 物理层

利用传输介质(双绞线、电缆等)为数据链路层提供物理连接,实现比特流的透明传输;简单的说就是数据的传输通道,传送电平信号,数据单位是比特(bit)

该层设备有集线器、网线、中继器等。

1.1.2 数据链路层

负责建立和管理节点间逻辑连接、进行硬件地址寻址、差错检测等功能。

接收来自物理层的位流形式的数据,并封装成数据帧格式传送到上一层;或者把上层的数据帧拆装为位流形式的数据再转发到物理层。数据的单位称为帧

该层设备有网桥、交换机等。

1.1.3 网络层

负责将数据传输到目标地址,就是路由和寻址,数据单位称为包;IP协议就处于网络层。

该层设备有路由器。

1.1.4 传输层

为上层协议提供端到端的可靠和透明的数据传输服务,包括差错校验处理和流控等。数据单位称为段。TCP、UDP协议处于传输层中。

1.1.5 会话层

负责建立、管理和终止表示层实体之间的通信会话。该层的通信由不同设备中的应用程序之间的服务请求和响应组成。将不同实体之间表示层的连接称为会话。因此会话层的任务就是组织和协调两个会话进程之间的通信,并对数据交换进行管理;数据单位是报文

1.1.6 表示层

提供各种用于应用层数据的编码和转换功能,确保一个系统的应用层发送的数据能被另一个系统的应用层识别;数据单位是报文

1.1.7 应用层

为上层用户提供应用接口,也为用户直接提供各种网络服务;数据单位是报文。常见协议有HTTP、FTP、DNS等。

1.2 TCP/IP分层模型

TCP/IP分层模型有两种:四层和五层模型,它们是对OSI七层模型的简化。 

2. 通信流程

了解了各层之间的框架后,我们就会好奇,各层次之间是怎么互相配合通信的呢?(以下针对TCP/IP协议模型讲解)

当应用程序传送数据时,数据被送入协议栈中,然后逐个通过每一层直到被当作一串比特流送入网络,其中每一层对收到的数据都要增加一些首部信息(有时还要增加尾部信息),这叫做对数据的封装。应用层要发送的数据经过层层封装传输到目标机,目标机从最底层一步步将封装的数据拆解到应用层,最终还原了数据的本身形态

举例说明:假如应用程序使用TCP协议发送数据“hello”,从上到下,首先经过应用层,在应用层将原始数据“hello”添加APP首部,此时数据变成了“APP首部+hello”,然后依次通过传输层、网络层,最后达到网络接口层,在最底层数据就被封装成了“各层的首部信息+hello”,将这些数据信息通过传输介质(例如网线)以二进制的形式发送比特流到目标机,目标机接收到封装后的数据后,从最底层到最高层,逐层拆包(大概的意思就是网络层就将IP首部拆除、输出层将TCP首部拆除),最后还原数据“hello”。

3. 网络层IP协议

3.1 IP地址概述

每个网络主机都会有一个IP地址,每个节点通过IP地址进行区分不同的主机,从而进行通信,路由器和主机都有一个IP地址。该IP地址是软件层面的一个地址,如192.168.xxx.xxx,而不是硬件层面的MAC地址。

IP地址分为IPv4地址和IPv6地址。IPv4地址有32位正整数表示,IPv6地址由128位正整数表示。

现在我们用的都是IPv4地址,将32位的 IP 地址以每8位为一组,分成4组,每组以 “.” 隔开,再将每组数转换成十进制数

IP地址由网络标识主机标识组成,可以通过子网掩码来确定网络地址和主机地址分别占用多少位。其中网络标识 = IP地址 & 子网掩码

3.2 IP首部

不含选项字段的IP首部包含20个字节,如下图所示。

其中32位源IP地址指明发送端主机的IP地址,32位目的IP地址指明接收端主机的IP地址,这样我们就可以知道数据从哪里来,要发往何处了。

3.3 IP路由选择

如果目的主机与源主机直接相连(如点对点链路)或都在一个共享网络上(以太网或令牌环网),那么IP数据报就直接送到目的主机上。否则,主机把数据报发往一默认的路由器上,由路由器来转发该数据报。

IP层既可以配置成路由器的功能,也可以配置成主机的功能。本质上的区别在于主机从不把数据报从一个接口转发到另一个接口,而路由器则要转发数据报。

IP层可以从TCP、UDP、ICMP、IGMP或者网络接口接收数据报并发送,IP层在内存中有一个路由表,当IP层接收并发送数据报时都会去检索下路由表,检查目的IP地址是否为本机的IP地址之一或者IP广播地址,如果不是,被设置成路由器功能的IP层就会对数据报进行转发(没设置成路由器功能的IP层会把该数据报废弃)。

3.4 IP地址分类 

IP地址可以分为5类:A类、B类、C类、D类和E类。我们常用的第一个字节为192的处于C类。

分配主机地址时,不可以全部为 0 或全部为 1。因为全部为 0 只有在表示对应的网络地址或 IP 地址不可以获知的情况下才使用,而全部为 1 的主机通常作为广播地址。

3.4.1 A类

A类IP地址由1个字节网络地址(网络地址最高位必须为“0”)和3个字节主机地址组成。

网络地址范围是0~127;

主要分配给具有大量主机而局域网络个数较少的大型网络使用

广播地址为:XXX.255.255.255

A类地址中设有私有地址和保留地址:

10.X.X.X:是私有地址,在互联网中不能使用,而被用在局域网中的地址;

127.X.X.X:是保留地址,也称为环回地址,主要用来测试网络协议是否工作正常,比如在电脑中使用ping命令去ping 127.1.1.1就可以测试本地TCP/IP协议是否正常。

0.0.0.0:只能用作源地址。0.0.0.0是不能被ping通的,在服务器中,0.0.0.0并不是一个真实的的IP地址,它表示本机中所有的IPv4地址。监听0.0.0.0的端口,就是监听本机中所有IP的端口。

3.4.2 B类

B类IP地址由2个字节的网络地址(网络地址最高两位必须为“10”)和2个字节的主机地址组成。

网络地址范围是128~191;

一般分配给中型网络使用

广播地址为:XXX.XXX.255.255

B类地址中设有私有地址和保留地址:

172.16.0.0 ~ 172.31.255.255:是私有地址;

169.254.X.X:是保留地址。

3.4.3 C类

C类IP地址由3字节的网络地址(网络地址最高三位必须为“110”)和1字节的主机地址组成。

网络地址范围是192~223;

广播地址为:XXX.XXX.XXX.255

分配给小型网络使用,如一般的局域网和校园网

192.168.X.X:是私有地址。

3.4.4 D类

D类IP地址第一个字节以“1110”开始,不分网络地址和主机地址,它是一个专门保留的地址,它并不指向特定的网络,目前这一类地址被用在多点广播(多播),多点广播地址用来一次寻址一组计算机,它标识共享同一协议的一组计算机。

地址范围:224.0.0.0~239.255.255.255 。

3.4.5 E类

E类IP地址以“1111”开始,为将来使用保留。

地址范围:240.0.0.0 ~ 255.255.255.255。

3.5 子网掩码

除了IP地址以外,主机还需要知道有多少比特用于子网号及多少比特用于主机号。这是在引导过程中通过子网掩码来确定的。子网掩码是一个32 bit的值,其中值为1的比特留给网络号和子网号,为0的比特留给主机号。

如下图所示:B类地址的两种不同的子网掩码格式,一个子网号和主机号都是8 bit宽,另一个划分成10 bit的子网号和6 bit的主机号。

4. 传输层协议

4.1 TCP协议

4.1.1  TCP协议概述

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的流协议

何为面向连接呢?

就是说两个使用TCP协议的应用(通常是一个客户端和一个服务端),在互相通信交换信息之前,必须先建立一个TCP连接,即进行三次握手,互相确认身份后连接。,连接上后,TCP就可以进行全双工通信了。

可靠又从何而来? 

 应用数据被分割成TCP认为最适合发送的数据块(由TCP传递给IP的信息单位称为报文段)。

 当TCP发出一个报文段后,它会启动一个定时器,等待目的端确认收到这个报文段。如果不能
及时收到一个确认,将重发这个报文段。(即发送端发送的每个TCP报文段都必须得到接收方的应答,才能认为这个TCP报文段传输成功)

 当TCP收到发自TCP连接另一端的数据,它将发送一个确认(这个确认不是立即发送,通常将延迟几分之一秒才发送)。

 TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错, TCP将丢弃这个报文段和不确认收到此报文段(希望发送端超时并重发)。

 TCP报文段作为IP数据报来传输,而IP数据报的到达可能会乱序,同理TCP报文段的到达也可能会乱序,由于重传机制,也可能会收到重复的数据;所以TCP协议还会将接收到的TCP报文段重排、整理、再交付给应用层。

 TCP还提供流控制,客户端和服务端都有固定大小的缓冲空间,发送或接收的数据不能超过这个缓冲空间。

流服务

两个应用程序通过TCP连接交换8 bit字节构成的字节流,TCP不在字节流中插入记录标识符,我们将其称为字节流服务。

4.1.2 TCP首部

TCP报文段的格式如下,TCP首部如果没有其它选项的存在,仅占20字节。

源端口号目的端口号用于寻找发送端和接收端的应用进程,这两个值加上IP首部中的源端IP地址和目的端IP地址就可以确定唯一一个TCP连接。IP地址加端口号也称为一个插口(socket)。

seq序号:用来标识从TCP发送端向TCP接收端发送的数据字节流,它的值表示在这个报文段中的第一个数据字节所处位置码,TCP协议会对发送或者接收的数据进行编号(按字节的形式)。

在TCP传送的数据流中,每一个字节都有一个序号。假如当前报文段的序号为100,且数据占100字节,则下一个报文段的序号就是200,序号到达2^32 - 1后又从0开始。

ack确认序号:期望收到的下一个报文段的首部中的序号,只有ACK标志为1时,确认序号才有效。

无法对数据流中选定的部分进行确认;例如,如果1~1024字节已经成功收到,下一报文段中包含序号从2049~3072的字节,收端并不能确认这个新的报文段,它所能做的就是发回一个确认序号为1025的ack。

也无法对一个报文段进行否认;例如,如果收到包含1025~2048字节的报文段,但它的检验和错,TCP接收端所能做的就是发回一个确认序号为1025的ack。

首部长度:仅占4 bit,表示TCP首部的总长度,4字节为一个单位计算,所以TCP首部总长度不能超过60(15*4)字节。

URG:紧急指针字段标志,如果是1表示紧急指针字段有效;

ACK:只有当ACK=1时,确认序号字段才有效;

PSH:为1时,接收方应该尽快将本报文段立即传送给应用层;

RST:为1时,表示出现连接错误,必须释放连接,然后再重建传输连接;还用来拒绝一个不法的报文段或拒绝打开一个连接;

SYN:“SYN=1,ACK=0”时表示请求建立一个新连接,带SYN标志的TCP报文段为同步报文段;

FIN:为1表示发送方没有数据要传输了,要求释放连接。

窗口大小:用于流控制,单位为字节,起始于ack确认序号字段指明的值,这个值是接收端正期望接收的字节。它是一个16 bit字段,因而最大为65535字节。

检验和:包含了TCP首部和TCP数据,是一个强制性的字段,由发送端计算和存储,并由接收端进行验证。

紧急指针:是一个正的偏移量,和seq序号字段中的值相加表示报文段最后一个字节的序号。

4.1.3 端口号

端口号用来标识能进行网络通信的进程,取值范围为0~65535。

一个主机通常只有一个IP地址,但是可以有多个端口号,每个端口号表示一个能上网的进程。

一个拥有IP地址的主机可以提供许多服务,比如Web服务、FTP服务、SMTP服务等,这些服务都是能够进行网络通信的进程,而IP地址只能区分网络中不同的主机,并不能区分主机中的这些进程,显然不能只靠IP地址,因此才有了端口号。通过“IP地址+端口号”来区分主机不同的进程

服务端中的这些服务有默认的端口号:

HTTP服务:默认端口号为80;

FTP服务:默认为21;

SSH服务:默认为22;

Telnet服务:默认为23。

4.1.4 TCP通信状态

CLOSED状态:表示一个初始状态;

LISTENING状态:表示服务端的某个SOCKET处于监听状态,监听客户端的连接请求;

SYN_SENT状态(客户端):表示客户端已发送SYN报文;

SYN_REVD状态(服务端):表示服务端接受到了SYN报文;

ESTABLISHED状态:表示连接已经建立;

FIN_WAIT_1状态:在ESTABLISHED状态时,主动关闭连接,向对端发送了FIN=1报文;

FIN_WAIT_2状态:对端接收到FIN=1报文,然后回应ACK=1报文后,则主动发起关闭端进入到该状态;

TIME_WAIT状态:表示收到了对端的FIN=1报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了;

LAST_ACK状态:它是被动关闭的一方,在发送FIN=1报文后,最后等待对方的ACK报文;

CLOSE_WAIT状态:表示等待关闭。

4.1.5 TCP连接的建立(重点)

TCP是一个面向连接的协议,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。双方建立连接的方式也叫做“握手”,需要进行三次“握手”才能完全建立起通信连接。

三次握手工作过程客户端发起、服务端监听):

第一次握手:客户端将报文段TCP首部中的SYN置为1,随机产生一个seq序号为J的值,然后把该数据包发送给服务端,表示请求建立连接,发送完成后,客户端会进入SYN_SENT状态,等待服务端确认。

第二次握手:服务端接收到客户端发过来的数据包后,解析发现SYN被置1了,知道客户端在请求建立连接了,于是,服务端将标志位SYN和ACK都置1,且随机生成一个seq序号为K的值,ack确认序号置为J+1的数据包发送到客户端,以确认客户端的连接请求,服务器端发送完后就会进入到SYN_RCVD状态。

第三次握手:客户端接收到服务端发来的确认数据包后,解析ack确认序号是否为J+1,ACK标志位是否为1,如果正确,则将ACK标志位置为1,ack确认序号置为K+1,然后把数据包发送给服务端,发送完后客户端进入ESTABLISHED状态;服务端接收到数据包后,检查ack是否为K+1,ACK是否为1,如果正确则服务端也进入ESTABLISHED状态,连接建立成功,自此客户端和服务端之间就可以正常通信了。

4.1.6  TCP连接的断开(重点)

因为TCP的通信是全双工的,每个通信方向都要单独关闭,所以断开总共需要四个数据包来确认连接的断开。这四个通信过程我们叫它“四次挥手”。发起断开请求可以是客户端,也可以是服务端

以下以客户端发起断开请求为例:

第一次挥手:客户端将FIN=1、随机生成seq序号值为M的数据包发给服务端,表示主动发起断开请求,发送完成后客户端进入FIN_WAIT_1状态,等待服务端应答;

第二次挥手:服务端接收到FIN=1的断开连接请求数据包,将标志位ACK置为1,ack确认序号置为M+1的数据包发回给客户端,表示确认了单方面的断开请求,此时客户端进入FIN_WAIT_2状态,而服务端此时还有数据要跟客户端通信,连接还没有完全关闭,等待服务端也发送FIN=1数据包;

第三次挥手:当服务端已经没有数据要发送了,则向客户端发送FIN=1、seq序号为N的数据包,表示断开连接请求,此时服务端进入LAST_ACK状态;

第四次挥手:客户端接收到服务端发来的FIN=1数据包后,回发一个ACK=1、ack确认序号为N+1的数据包,客户端此时进入TIME_WAIT状态,等待2ms延迟没收到服务端信息后就进入关闭状态,服务端接收到应答数据后就断开了连接,进入关闭状态。

4.2 UDP协议

4.2.1 UDP协议概述

UDP(User Datagram Protocol):用户数据报协议,是一种无连接、不可靠的协议

不可靠性体现在它把应用程序传给IP层的数据包发送出去,可以确保发送消息的大小,却不能保证消息一定会到达,出现差错直接丢弃,无反馈机制。

由于它不像TCP协议那样复杂,无连接、重发机制、应答机制等,所以它的传输速度会较快。

UDP协议传输出现错误的概率是很小的,并且它的实时性非常好,常用于实时视频的传输,比如直播、网络电话等,所以,UDP协议还是会被应用与对传输速度有要求,并且可以容忍出现差错的数据传输中。

4.2.2 UDP首部

源端口号和目的端口号同TCP一样;

UDP长度:指的是UDP首部和UDP数据的字节长度; 

UDP检验和:包含UDP首部和UDP数据,UDP的检验和是可选的,而TCP的检验和是必需的。

参考文章

TCP_IP详解卷1

正点原子嵌入式Linux C应用编程指南

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

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

相关文章

常用的代码命名方法

常见的三种命名方法1 驼峰命名法(CamelCase)驼峰命名法应该我们最常见的一个,这种命名方式使用大小写混合的格式来区别各个单词,并且单词之间不使用空格隔开或者连接字符连接的命名方式1 大驼峰命名法(UpperCamelCase&…

Mysql 基础-持续更新

去重 DISTINCT DISTINCT 关键字的主要作用就是对数据表中一个或多个字段重复的数据进行过滤,只返回其中的一条数据给用户 注意点: DISTINCT 关键字只能在 SELECT 语句中使用。在对一个或多个字段去重时,DISTINCT 关键字必须在所有字段的最前…

IPv6路由协议实验配置(ospfv3、isis-ipv6、bgp4+)

目录 OSPFv3实验配置 建立OSPFv3邻居 AR1修改DR优先级 AR1引入直连路由 配置Stub区域 ISIS IPv6实验配置 建立ISIS邻居 修改AR1的DIS优先级 在AR1上配置路由泄露 BGP4实验配置 AR1与AR2、AR3建立IBGP邻居关系 AR2与AR4建立EBGP邻居关系 配置AR1为反射器 OSPFv3实验…

Android时间与服务器同步方案

转自: https://blog.csdn.net/qinci/article/details/70666631这个的吧?转发请注明来源吧?Android时间与服务器同步方法_飛舞的青春的博客-CSDN博客Android时间与服务器同步方案 在部分软件应用场景里,我们对应用时间要求非常苛刻…

mysql navicat函数_Navicat for MySQL函数高级属性

过程和函数是一组可以保存在服务器上的SQL语句。MySQL(www.formysql.com)函数高级属性主要涉及安全性,定义者,数据访问,决定性等方面的内容Navicat 函数高级属性安全性:指定用创建函数的用户权限来运行函数,或是用启用…

【C++】vector (vector的介绍及使用)

文章目录vector的介绍及使用前面我们学习了string,我们在学vector可以结合之前的理解,所以我们vector就不详细介绍了。 vector的介绍及使用 vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就…

一个没有混进大厂的普通程序员,10年真实收入变化

有人说,程序员的高收入和工作年限成正比,认为自己的薪资应该如此计算: private static boolean 计算工资() { //years工作时长(年)int years 5;while(years-- > 0){做项目();团建活动();涨工资();拿年终奖();}return 跳槽() &&…

2021年亚太杯APMCM数学建模大赛A题图像边缘分析与应用求解全过程文档及程序

2021年亚太杯APMCM数学建模大赛 A题 图像边缘分析与应用 原题再现: 随着科学技术的发展,对各种工件和零部件测量精度的要求越来越高,对测量仪器的要求也越来越高。数字图像尺寸测量仪器等各种图像测量设备目前正逐渐取代传统的手动卡尺测量…

Vue 常用内置指令

Vue 常用内置指令描述指令内容渲染指令{{}} 与 v-text覆盖面积v-text{{}}闪现问题{{}}v-textv-html属性绑定指令v-bind简写 :事件绑定指令v-on参数事件对象$event事件修饰符按键修饰符双向绑定指令v-model修饰符条件渲染指令v-show 与 v-if 的区别实现原理性能消耗举个栗子v-el…

C#构建Web服务项目实战(二)

概述本文演示了如何通过Ajax访问C# ASP.NET项目中的WebService方法(.asmx文件形式)。本文的项目配置参见前文:C#构建Web服务项目实战(一)。环境Visual Studio 2017 / VS2019C# ASP.NET Web服务Win11 / Win10类似.NET F…

由浅入深地学习指针(学习指针必看)

目录 指针初阶 指针定义 指针和指针类型 c语言的整型指针解引用与整型变量的区别 内存 指针和指针类型 指针类型的意义 野指针 规避野指针 指针运算 指针和数组 二级指针 指针数组 指针进阶 指针的概念再提起 字符指针 《剑指offer》 字符串常量: …

【基于机械臂触觉伺服的物体操控研究】UR5e运动学建模及代码实现

我的毕设题目定为《基于机械臂触觉伺服的物体操控研究》,这个系列主要用于记录做毕设的过程。 前言:UR系列是优傲公司的代表产品,也是目前比较通用的产品级机械臂。所以我打算用该机械臂进行毕设的仿真实现。关于其运动学建模,网…

【每日一题】【LeetCode】【第十二天】区域和检索 - 数组不可变

解决之路 题目描述 测试案例(部分) 第一次 emmm,说实话,一开始我还真没看懂题目是什么意思。。。。 自己按我自己理解的方式写了一下代码,用测试案例跑了下,成功了。 不过,放进去跑不通&…

VScode远程调试深度学习debug

VS Code CtrlP,在搜索框>select interpreter检查一下python环境 #查看GPU 环境;版本号 nvidia-smi.exe使用VSCode进行深度学习首先进行debug 首先要安装Remote Development个人理解可以远程打开编辑文件。 点击左下角的箭头,在对话框中…

async-excel整合站内信通知用户体验感满满

前面的文章我们讲过消息中心站内信的实现 【消息中心】 那么本章我们来说说异步导入导出完成后,如何使用消息中心站内信的功能进行通知用户业务处理完成了 在async-excel中异步逻辑处理完成后会调用一个callback方法进行回调,所以我们可以再对async-exc…

完全二叉树与堆(包含STL堆的用法)

完全二叉树 完全二叉树为一类特殊的二叉树,高度为h的完全二叉树满足如下条件: (1)所有叶结点都出现在第h或h-1层; (2)第h-1层的所有叶结点都在非叶结点的右边; (3&#…

AAAI 2023|模拟人脑场景感知过程,套娃Transformer讲故事能力更上一层楼

原文链接:https://www.techbeat.net/article-info?id4467 作者:seven_ 视频字幕生成目前已成为工业界AI创作领域非常火热的研究话题,这一技术可以应用在短视频的内容解析和讲解中,AI讲故事的技术已经越来越成熟。而在学术界&…

13、ThingsBoard-如何发送告警邮件

1、概述 很多时候,我们使用thingsboard的时候,会遇到比如一个设备触发了告警,如何将设备的告警消息定义成邮件模板,然后通知租户或者客户管理员,管理员进行处理,这样的需求是非常重要的。 2、实现的步骤 要实现这个需求我总结了几步: 2.1、设备上报的参数与阈值进行…

基于关键点检测的病患步态检测及分析方法

在临床工作中,对患有神经系统或骨骼肌肉系统疾病而可能影响行走能力的患者需要进行步态分析,以评定患者是否存在异常步态以及步态异常的性质和程度 步态评定临床意义 1、评估患者是否存在异常步态以及步态异常的性质和程度 2、为分析异常步态原因和矫正异…

看我们应用性能监控如何几秒钟定位慢访问跟因

背景 某汽车集团的汽车配件电子图册系统是其重要业务系统。最近业务部门反映,汽车配件电子图册调用图纸时,出现访问慢现象。 某汽车集团总部已部署NetInside流量分析系统,使用流量分析系统提供实时和历史原始流量。本次分析重点针对汽车配件…