【计算机网络 | 第七篇】计网之传输层(一)—— 传输层概述与协议头分析

⭐️在这个怀疑的年代,我们依然需要信仰。

个人主页:YYYing.

⭐️计算机网络系列专栏:

【从零开始的计算机网络】

⭐️ 其他专栏:【linux基础】【数据结构与算法】

系列上期内容:【计算机网络 | 第六篇】计网之网络层

系列下期内容:暂无


目录

前言:

传输层概述

一、传输层的作用

二、TCP/IP运输层中的两个重要协议

2.1、TCP

2.2、UDP

2.3、因特网中典型应用使用的运输层协议

三、传输层端口号

四、UDP和TCP的对比

UDP的报文段格式

大小端知识点

TCP的报文段格式

[● 源端口](#● 源端口)

[● 目的端口](#● 目的端口)

[● 序号](#● 序号)

[● 确认号](#● 确认号)

[● 确认标志位ACK](#● 确认标志位ACK)

[● 数据偏移](#● 数据偏移)

[● 保留6位](#● 保留6位)

[● 控制标志位](#● 控制标志位)

[● 窗口](#● 窗口)

[● 校验和](#● 校验和)

[● 选项](#● 选项)

结语


前言:

因考虑到我们的传输层内的东西太多太重要了,故我并不想简单带过(其实凭自身能力也没办法简单带过doge),所以我将会把此章节拆开来讲。

在上一篇中我们讲完了网络层的内容,我们了解了网络层的设计选择网络层协议 ,那么这一篇我将会带领大家一起学习我们传输层的内容。

(我们此专栏 目前会使用的软件是------Wireshark,如有需求,请移至**此处官网**进行下载,如有问题,请在评论区留言)

传输层概述

我们现在学了计算机网络体系结构中的物理层,数据链路层,网络层 。而我们网络层是不是将我们异构网络用IP协议统一化管理了起来 ,我们的数据到了网络层之后,也就是到了计算机,所有的计算机在操作系统层面上来说,一般都会分为不同的进程 ,**那么我们网络层的数据怎么跟进程打交道呢?**这个时候我们就提出了传输层

一、传输层的作用

首先我们要知道,传输层最主要的作用其实就两个:

1> 为不可靠的网络层是否提供可靠传输。

2> 提供多台主机应用进程之间的端到端的传输行为。

计算机网络体系结构中的物理层、数据链路层和网络层,它们共同解决了将主机通过异构网络互联起来所面临的问题,实现了主机到主机的通信

那么如何为运行在不同主机上的应用进程提供直接的逻辑通信服务,就是传输层的主要任务,传输层协议又称为端到端协议

传输层提供了**"端口"**的概念,用来区分不同应用进程的标识符。运输层向应用层实体屏蔽了下面网络核心的细节(例如网络拓扑、所采用的路由选择协议等),它使应用进程看见的就好像是在两个运输层实体之间有一条端到端的逻辑通信信道

根据应用需求的不同,因特网的运输层为应用层提供了两种不同的运输层协议 ,即面向连接的TCP和无连接的UDP****,这两种协议就是本章要讨论的主要内容。

二、TCP/IP运输层中的两个重要协议

2.1、TCP

传输控制协议Transmission Control Protocol,TCP )为其上层提供的是面向连接可靠的数据传输服务。

● 使用TCP通信的双方,在传送数据之前必须首先建立TCP连接(逻辑连接,而非物理连接)。数据传输结束后必须要释放TCP连接

● TCP为了实现可靠传输,就必须使用很多措施,例如TCP连接管理、确认机制、超时重传、流量控制以及拥塞控制等

● TCP的实现复杂,TCP报文段的首部比较大,占用处理机资源比较多

看完上面四个特点你肯定多少会觉得我们TCP的可靠传输所用网络开销是会很大的,也前确实是这样,所以现在我们慢慢也开始重视UDP的开发了,大家可以作为一种新的趋势了解一下即可。

2.2、UDP

用户数据报协议User Datagram Protocol,UDP )为其上层提供的是无连接不可靠的数据传输服务。

● 使用UDP通信的双方,在传送数据之前不需要建立连接

● UDP不需要实现可靠传输,因此不需要使用实现可靠传输的各种机制

● UDP的实现简单,UDP用户数据报的首部比较小

当然此处你不妨换个角度想 ,是不是因为下面层的协议不可靠 + 我们UDP本身不可靠才导致我们UDP协议是不可靠的传输服务,所以我们如果在传输层下面的层去研究一些小协议,那么我们是不是就有可能保证UDP的可靠传输了。这也就是我们互联网的发展趋势,因为我们的底层的协议是越来越好的,链路的质量也是越来越高的

像有些小项目也会这么做,使用UDP的高效性,而可靠性我们在应用层来完成。

2.3、因特网中典型应用使用的运输层协议

三、传输层端口号

那么上述的是否可靠传输我们就讲完了。接下来该看我们的第二点了:提供端到端的传输行为

依旧在讲之前,我会给大家讲一下此处的大体逻辑:我们应用层是采用进程号来识别不同运行的程序,现在 A 的进程号是1991,而 B 的进程号也叫1991,那么他俩要通信,直接使用进程的PID号来作为身份识别标志,那不就乱套了,所以这个时候我们提出了端口号(port)现在我们网络系统识别一个进程就是IP : port 。注意:本机系统识别一个进程还是靠进程号。然后就是一个进程号理论上是只能对应一个端口,但其实实际是能一对多的。

● 运行在计算机上的进程是使用进程标识符Process Identification,PID)来标识的。

○ 然而,因特网上的计算机并不是使用统一的操作系统,而不同操作系统(Windows、Linux、 MacOS)又使用不同格式的进程标识符

○ 为了使运行不同操作系统的计算机的应用进程之间能够基于网络进行通信,就必须使用统一的方法对TCP/IP体系的应用进程进行标识

● TCP/IP体系结构的运输层使用端口号来标识和区分应用层的不同应用进程。端口号的长度为16比特,取值范围是0~65535。

● 端口号的分类

多提一嘴,TCP和UDP的端口号之间是没有关系的,他们是独立的。

四、UDP和TCP的对比

小点我们就说到这,现在我们开始讲大头------UDP和TCP报文段格式

UDP的报文段格式

● UDP是无连接的,减少了建立和释放连接的开销

● UDP尽最大能力交付,不保证可靠交付

○ 不需要维护复杂的参数,首部只有8个字节(TCP首部至少20字节)

● UDP长度

○ 占16位,首部的长度 + 数据长度

● 校验和的计算内容:伪首部 + 首部 + 数据

○ 伪首部:仅在计算校验和时起作用,并不会传递给网络层

那我们此处的校验和有什么意义呢,我们都知道IP协议中也是有校验和的,那他都把前面的数据都检查完了,那此处的校验和是不是显得有点没事找事的感觉?所以我们会用到伪首部来赋予其意义,我们伪首部就是用于传输层自己的一套校验的数据结构,其就只是参与计算,并不会被传输

那么看完文字和图片后我们的理解肯定还不到位,我们再抓几个包来给大家看看。

可以看到我们的端口号信息,前两个字节是源端口号,而后两个字节是目的端口号。

大小端知识点

那这个时候可能会有人问为什么是 80 的地址位更低而不是 6f 更低?(此处涉及计组知识)这是因为我们数据在cpu里是小端存储,但在我们网络里是大段存储(大端小端的概念我们可以简单理解为数据的低位在低地址存储就是小端,低位在高地址存储就是大段,如下图)

然后我们再看刚才那个问题,现在是不是能理解为什么我们的80地址更低了,因为我们抓包软件抓的是网络层面的包,所以是大段存储,我们才能看到这样。

了解完这个小点,我们继续看我们的包:

我们可以看到,我们UDP的长度其实也就是我们UDP的头长 + 数据长度 ,67 - 8 = 59。而且在此处由于我们UDP是定长的,所以在这块的长度字段是很多余的,你不妨想想,我们IP协议是不是也有总长度来着 ,那我们IP协议再靠它自己的首部长度是不是就能轻松算出数据的长度呢,也不太需要UDP此处的总长,其实我们这块UDP长度设计出来也确实有着占位的意思。

TCP的报文段格式

● 源端口

源端口号表示报文的发送端口,占16位。源端口和源IP地址组合起来,可以标识报文的发送地址

● 目的端口

目的端口号表示报文的接收端口,占16位。目的端口和目的IP地址相结合,可以标识报文的接收地址

TCP协议是基于IP协议的基础上传输的TCP中的源端口号+源IP,与TCP中的目的端口号+目的IP一起,组合起来唯一性的确定一条TCP连接

● 序号

占32比特,取值范围 ~ 。当序号增加到最后一个时,下一个序号又回到0。用来指出本TCP报文段数据载荷的第一个字节的序号

● 确认号

占32比特,取值范围 ~ 。当确认号增加到最后一个时,下一个确认号又回到0。用来指出期望收到对方下一个TCP报文段的数据载荷的第一个字节的序号,同时也是对之前收到的所有数据的确认

● 确认标志位ACK

只有当ACK取值为1时,确认号字段才有效 。ACK取值为0时,确认号字段无效。TCP规定:在TCP连接建立后,所有传送的TCP报文段都必须把ACK置1

我们一直在提的一个问题是要可靠,而可靠从目前我们理解的算法中,不管你算法有多叼,一定会有发送确认机制。

我们TCP其实也就是面向连接的流式套接字,那怎么叫做流呢?其实流的是我们的字节,也就是我们序号的单位并不是数据包,而是字节。

需要知道不管是发送端 还是接收端,都是会有两种缓存区的------接受和发送。

我们可以看到下图中的案例,1>首先我们的客户端给服务器发了一个100字节的包,其中我们的 序号 = 201 ,确认号 = 800,ACK = 1;2>那拿到这个信息后我们该如何看呢,我们首先就看我们的序号,我们发现我们的序号是201,且我们的内容总长度为100,那么我们就可以直接确认对方服务器发来的确认号为多少了,就是201 + 100 = 301,因为现在我们服务器收完了第一个包,肯定期望收到对方下一个包,那下一个包肯定是会连着发的,所以我们的确认号为301;3>那么我们服务器的序号是怎么定的呢,这就得看我们客户端了,我们客户端要求我们服务器下次发来的包是从服务器发送缓存区的包中哪个序号开始的那么我们服务器的确认号就是啥,那此处就是800。

那么,我们依旧来看三道考研真题来检验下我们的学习成果。

我们可以看到甲向乙一次性连续发了两个包分别是300字节和500字节,而第一个包的序号是200,那么我们第一个包的最后那个字节的序号是不是就是499,200 ~ 499之间刚好300字节嘛,那我们第二个包的序号是不是就是从500开始了,那内容也是500字节,那第二个包的最后那个字节就是999了,所以我们甲发的确认号就是999 + 1 = 1000,选D。

那我们的第二题呢,跟上题原理不能说一模一样,只能说完全一致,大家自己做做看吧,图中答案也标了。

那么,到了我们的第三题其实就有一点点难度了,相当于我们需要倒着推一下,我们的入手点其实就是第三段数据的序号,可以看到我们第三段序号=900,那就说明,在之前已经可能有900的内容了,而我们第二段数据的有效载荷是400,那就说明我们第一段之前也已经可能有500的内容了,所以我们第二段的序号是500。那我们是选B呢还是选C呢,答案是B,因为我们第二段的数据是丢失了的,所以我们主机乙要让主机甲重发这第二段,而不是接着第三段的最后继续发。

● 数据偏移

○ 占4比特,该字段的取值以4字节为单位

○ 指出TCP报文段的数据载荷部分的起始处距离TCP报文段的起始处有多远,实际上就是TCP报文段的首部长度

与我们上篇所讲的IP协议比较,除去表示的算法可谓是一模一样。

● 保留6位

暂时没有用处

其实这块的6位并非我们实际的选择,我们可以在我们的抓包软件上来看看:

我们可以发现其实在我们抓包软件上只有3位是预留位,9位是标志位。

● 控制标志位

○ 同步标志位SYN

SYN为1的TCP报文段要么是一个连接请求报文段,要么是一个连接响应报文段

○ 终止标志位FIN

■ 用于TCP"四报文挥手"释放连接。

■ 当FIN=1时,表明此TCP报文段的发送方已经将全部数据发送完毕,现在要求释放TCP连接。

○ 复位标志位RST

■ 用于复位TCP连接。

■ 当RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立连接

■ RST置1还用来拒绝一个非法的TCP报文段或拒绝打开一个TCP连接。

○ 推送标志位PSH

■ 发送方TCP把PSH置1,并立即创建一个TCP报文段发送出去,而不需要积累到足够多的数据再发送。

接收方TCP收到PSH为1的TCP报文段,就尽快地交付给应用进程,而不再等到接收到足够多的数据才向上交付

● 窗口

○ 占16比特,该字段的取值以字节为单位

○ 指出发送本报文段的一方的接收窗口的大小,即接收缓存的可用空间大小,这用来表征接收方的接收能力

○ 在计算机网络中,经常用接收方的接收能力的大小来控制发送方的数据发送量,这就是所谓的流量控制

● 校验和

○ 占16比特

○ 用来检查整个TCP报文段在传输过程中是否出现了误码。

● 选项

○ 长度可变,跟IP协议一样最大40字节

○ 最大报文段长度MSS选项:指出TCP报文段数据载荷部分的最大长度,而不是整个TCP报文段

○ 窗口扩大选项:用来扩大窗口,提高吞吐率

○ 时间戳选项:

■ 用于计算往返时间RTT

■ 用于处理序号超范围的情况,又称为防止序号绕回PAWS。

○ 选择确认选项:用来实现选择确认功能。

结语

那么关于计网之传输层第一部分的讲解就到这里了。

**我是YYYing,**后面还有更精彩的内容,希望各位能多多关注支持一下主包。

无限进步, 我们下次再见。

相关推荐
zyxzyx491 小时前
大模型本地化部署实战:从服务器性能调优到低成本落地全攻略
服务器·开发语言·php
tobias.b1 小时前
408真题解析-2009-38-网络-TCP累积确认
网络·网络协议·tcp/ip·计算机考研·408真题解析
何双新1 小时前
TCP 协议深度解析与实践:从零基础到精通
网络·网络协议·tcp/ip
小李独爱秋1 小时前
计算机网络经典问题透视:RTCP协议深度解析——从应用场景到五大分组类型
网络·网络协议·tcp/ip·计算机网络·信息与通信·rtcp
晚风吹长发2 小时前
初步理解Linux中的进程间通信以及管道通信
linux·运维·服务器·c++·进程·通信
小白电脑技术2 小时前
玩客云OneCloud开启SMB文件共享教程
网络·电脑
开开心心_Every2 小时前
无广告输入法推荐:内置丰富词库免费皮肤
服务器·前端·学习·决策树·edge·powerpoint·动态规划
wheeldown3 小时前
【Linux】 Linux网络编程入门:Soket编程详解
linux·运维·网络
Godspeed Zhao10 小时前
现代智能汽车中的无线技术25——Wi-Fi(13)
网络·汽车·智能路由器·信息与通信