Linux网络原理与编程(4)——第十四节 传输层协议

news2024/12/26 22:39:38

目录

前置知识

再谈端口号

几个函数

netstat

telnet

UDP报文

UDP协议端格式

UDP首部:

UDP的特点

UDP的缓冲区

TCP报文详解

Tcp报头详解


传输层是在应用层的下面一层,我们在讲解传输层协议之前,先来说一说一些前置知识即命令函数等;然后,我们本节主要来介绍UDP、TCP的报文。

前置知识

再谈端口号

端口号(Port)标识了一个主机上进行通信的不同的应用程序;

在TCP/IP协议中, 用 "源IP", "源端口号", "目的IP", "目的端口号", "协议号" 这样一个五元组来标识一个通信(可以通过

netstat -n查看);(协议号一般是指用的是哪种协议 )

通过端口号,加上我们的ip,就是先了从一个主机到另外一个主机上的通信

端口号范围划分:

0-1023 属于知名端口;比如,

ssh服务器, 使用22端口

ftp服务器, 使用21端口

telnet服务器, 使用23端口

http服务器, 使用80端口

https服务器, 使用443

1024-65535:属于OS动态分配的端口号;可供用户使用的端口。

我们自己写一个程序使用端口号时, 要避开这些知名端口号

几个函数

netstat

netstat是一个用来查看网络状态的重要工具.

语法: netstat [选项]

功能:查看网络状态

常用选项

-n 拒绝显示别名,能显示数字的全部转化成数字

-l 仅列出有在 Listen (监听) 的服務状态

-p 显示建立相关链接的程序名

-t (tcp)仅显示tcp相关选项

-u (udp)仅显示udp相关选项

-a (all)显示所有选项,默认不显示LISTEN相关

比如:

 可以查看一下网络状态信息。

telnet

telnet [-d] [-a] [-n tracefile] [-e escapechar] [[-l user] host [port]]

用于远程登录。相关参数的意义可参考:

Telnet的命令 - Lunaa - 博客园

UDP报文

UDP协议端格式

UDP不保证可靠性。实际上,它啥也不保证。它里面只有一个校验和的东西,用于检验报文是否被破坏,当发现被破坏后,它啥也不管,直接丢弃。当然,这也保证了其高效快速。(DNS协议就是基于udp的)

UDP首部:

对应的源码:

UDP的脑袋上面还有协议,那么其就必须要解决:数据和有效载荷分离的问题。

怎么做呢?

我们知道,UDP是属于定长报头。就是说,其报头是长度是一定的。前面的8个字节就是报文,后面的就是数据。

udp拿到有效载荷后,要交付给自己上层的协议没错,但是上层的用户协议本质上是一个进程绑定在一起的。

那我怎么知道我要交给脑袋顶上的哪个进程?

在udp上有16为目的端口号。用端口号去查找进程是采用哈希的算法来去查找的。

在前面的16位源端口号就是客户端的端口号。就相当于recvfrom()函数里面的sin_port

而所要读的有效载荷就是通过udp16位长度来确定。通过这个16位udp长度来去确定判断我的这个报文有没有读完,从而确保交付给上层的是一个完整的udp报文

16位UDP长度, 表示整个数据报(UDP首部+UDP数据)的最大长度;

16位UDP校验和,用来检验报文是否完整。如果校验和出错, 就会直接丢弃;

UDP的特点

UDP传输的过程类似于寄信.

三个特点:

无连接: 知道对端的IP和端口号就直接进行传输, 不需要建立连接;

不可靠: 没有确认机制, 没有重传机制; 如果因为网络故障该段无法发到对方, UDP协议层也不会给应用层

不返回任何错误信息;

面向数据报: 不能够灵活的 控制读写数据的次数和数量

 我们来解释一下面向数据报:

应用层交给UDP多长的报文, UDP原样发送, 既不会拆分, 也不会合并;(核心)

用UDP传输100个字节的数据,如果发送端调用一次sendto, 发送100个字节, 那么接收端也必须调用对应的一次recvfrom, 接收100个字节; 而不能循环调用10次recvfrom, 每次接收10个字节;

UDP的缓冲区

UDP没有真正意义上的 发送缓冲区. 调用sendto会直接交给内核, 由内核将数据传给网络层协议进行后续的传输动作;(之所以有缓冲区,是为了提高IO的效率)

UDP具有接收缓冲区. 但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致; (但是TCP不会存在这个问题

如果缓冲区满了(实际上就是一块内存), 再到达的UDP数据就会被丢弃;(但是TCP不会存在这个问题

UDP的socket既能读, 也能写, 这叫做 全双工

基于UDP的应用层协议:

NFS: 网络文件系统

TFTP: 简单文件传输协议

DHCP: 动态主机配置协议

BOOTP: 启动协议(用于无盘设备启动)

DNS: 域名解析协议

思考,为啥会有可靠性问题?
因为网络实际上是将我们的线变长,由于路线更长,就会有可能存在着各种问题。

不可靠有哪些情况?

发生丢包、乱序、错误、缓冲区溢出等情况。

那我们能不能设计一种协议方案,使得其能够保证可靠性呢?

当然,它就是TCP(当然tcp解决的不止这些问题)

TCP报文详解

我们本节,主要来讲TCP的报头(报文格式)

Tcp报头详解

图示:

源码:

可以看到,它们刚刚好是一一对应的。源码时图示在代码上的体现。(注意,这里的tcp协议可能比较新,这里有八个标志位)
我们接下来,来详细地讲解下TCP报文里面的每一个内容(参数)

首先对于tcp协议而言,作为传输层协议,其还是需要解决两个问题:数据包和有效载荷分离 以及我要交付给上层哪一个协议的问题。

【四位首部长度、有效载荷分离及向上交付】

1、4为首部长度即可以让我们让我们知道什么时候能将报头读完。

它表示该TCP头部有多少个32位bit(有多少个4字节) 即每个值按照四个字节来计算;

2、因此选项的大小最多为60-20 = 40个字节,首部长度最少为5。选项也是报头。

3、所以其要实现报头和有效载荷分离:先无脑式地把20个字节拿下来,然后再读四位首部长度,根据四位首部长度的值来去判别是否需要读取选项。

【接下来:】

4、根据目的端口号,经过哈希算法,找到对应的进程。

5、注意到,这里的tcp并没有读取数据的大小的参数。即这里只有数据首部长度,没有数据总长度。原因很简单,是因为其不需要。因为tcp并不需要按照数据块交付。它收到了数据只要放置在自己的缓冲区里就可以了。其是面向字节流的。上层怎么读由上层决定。

6、那我怎么检验数据的完整性呢?答案就是用16位校验和。如果你少了些许报文或者是多了报文,那么校验和一定会有问题(即校验失败)发送端填充, CRC校验. 接收端校验不通过, 则认为数据有问题. 此处的检验和不光包含TCP首部, 也包含TCP数据部分.

7、关于32位序号和确认序号:

a.关于可靠性:有绝对可靠性和相对可靠性。

(1)加入客户端给服务器发了一个消息,客户端怎么知道服务器收到了呢?原因是:服务器在收到之后,会向客户端发送一个ACK(应答)。对于客户端而言,其意义就是:我之前发送的消息服务器都收到了。

(2)但是,我们会发现,在通信过程当中,永远会有最新的一条消息没有ACK。(注意:不需要对ACK再次ACK了)

(3)所以,在互联网通信过程当中,是没有绝对可靠性的。但是有局部相对可靠性(是不是有马克思主义原理的味道了hhhh)。

(4)故:只要收到了对应的应答,认为之前的数据对方已经收到。这种机制,称为确认应答机制。(我们后面还会说)

(5)对于client而言,不论是在其将数据发送给服务器的时候数据丢失,还是服务器返回的ACK丢失,其都认为自己的数据对方没有收到,这个时候,就会有超时重传机制。 而重传到服务器之后,服务器如果在一段时间内收到了相同的报文,其也就知道自己的ACK丢了。(ACK一般不携带数据,单次简单的应答。当然当代的数据通信中也可能会携带数据)

b.那么这两个序号是干什么的呢?

(1)我们知道,即便同一时间段发送的信息,其发送的消息是串行的,但是其有可能在接收的时候乱序。(这个与路径选择有关)

(2)但是,如果我们将我们发送的每一条信息编号,那么就不用担心乱序的情况了。

(3)所以,序号是为了保证客户端->服务端的按序到达。当一条信息收到之后,会发送ACK。而客户端收到ACK之后,意味着在这个序列之前的所有信息服务器都收到了。

(4)在ACK进行确认时,其返回的确认序号应当是发送过来的原始序号+1.

(比如,我发送出去了一个序号位7的数据,那么其返回的确认序号位8.对于客户端而言,这个8的意思:8之前的数据,我服务器全部都收到了,接下来服务器想让我从8开始发。注意,即使这个时候含有确认序号6、7的ACK丢了,但是也不需要重传了,因为我收到了8,就代表着服务器端在7之前的数据都收到了。这种机制的存在,就允许了ACK有部分的丢包情况)

注意:由于TCP是全双工的,双方的通信地位对等,即一方在接收数据的同时,也可以发送数据。我接收的时候,重点关注的是32位序号,而其作为收到应答的时候,关注的是确认序号。

所以,在一个报头当中,32位序号和32位确认序号同时存在。

所以,序号主要解决的是按序到达的问题(当然,其也让确认应答更加准确和高效)。为什么要用两套,是因为tcp是全双工的。

所以,ACK和序号解决了丢包问题(引发其超时重传机制),而序号解决了乱序的问题。

8、我们之前在看sock源码的时候,发现其有一个receive_queue和write_queue,其含义就是发送缓冲区和接收缓冲区。(我们后面会继续说)

9、如果用户区的数据计算比较复杂,而传输又比较快,就有可能会出现接收缓冲区满了的问题。这个时候,如果继续传送,就有可能会出现报文丢失的问题。

10、16位窗口大小为:接收缓冲区(发送方的)的剩余空间的大小。从这里的窗口大小,就可以实现流量控制。

11、六个标志位SYN表示该报文是一个链接请求的报文。如果没有SYN/FIN,就说明其是一个正常的数据。FIN表示断开连接的报文ACK表示应答确认。即该报文具有确认机制作用。

PSH即push:表示催促,希望对方将报文尽快向上交付、发送方快速清空。RST见下。UGR:打破数据的按序到达。表示当前携带的报文中需要优先被处理。(类似插队)

关于RST:

它和TCP的三次握手有关。虽然具体细节我们还没有说,但是我们已经有了三次握手建立连接的这样一个概念。试想,是不是三次握手一定能建立成功?答案当然是否定的。当第一次或者第二次的报文丢了的话,我们实际上并不担心,因为这个时候,我们的客户端并未和服务器处于连接的状态。

但是如果第三次丢了(但实际上,这种概率很小),这个时候,我们的客户端并不知道,而它自己已经处于established状态了。 (因为其已经收到了服务器的ACK)但是我们的服务器并未处于连接状态

这个时候,客户端认为连接已经建立成功了,所以就正常发数据。但是这个时候服务器并未建立连接,在收到数据之后,会向客户端发送一个含有RST的报文(reset),即希望客户端重新建立连接。

12、16位指针就是URG的偏移量。紧急指针又叫做带外数据。(这个我们可以在recv函数的最后一个参数中手动设置。比如设置位MSG_OOB,就表示要读取这个紧急指针标志位。注意,这里的紧急指针只能插一个数据,因为其没有结束的范围标识)

(注:紧急指针不是指针,就是一个整数,表示一个偏移量)
好啦,本节内容就到这里啦~~~
原创不易,如果觉得写的不错,就点个赞呗~~~笔芯~~~~
下面是笔者的微信公众号,也欢迎来关注呀~~~

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

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

相关文章

看完就会flink基础API

文章目录一、执行环境(Execution Environment)1、创建执行环境2、执行模式(Execution Mode)3、触发程序执行二、源算子(Source)1、数据源类准备2、从集合中读取数据3、从文件中读取数据4、从Socket中读取数据5、从Kafka中读取数据…

ISCSLP 2022 Program|希尔贝壳邀您参加第十三届中文口语语言处理国际会议

第十三届中文口语语言处理国际会议将于2022年12月11-14日(本周日~下周三)正式开启,本次会议中的部分Session将通过语音之家视频号进行线上直播,欢迎大家参加! 官网:www.iscslp2022.org 大会简介 中文口语…

ABAP学习笔记之——第十二章:SALV

一、概要 在Net Weaver 2004 平台上集合了利用函数和 GRID 的功能发布的 SALV 包程序 (SALV也称为 New ALV)。SALV 可以像利用函数生成 ALV 的不用创建屏幕就可以调用的全屏式ALV,还可以利用控制器在屏幕的控制器中显示 ALV。利用GRID 的ALV 虽然不能注册成 Batch …

速卖通知识产权规则介绍,如何才能规避侵权的问题?

最近有商家咨询到我,关于速卖通对商品知识产权是怎么评判的,今天就来给大家科普一下平台关于知识产权的规则介绍 速卖通平台严禁用户未经授权发布、销售涉嫌侵犯第三方知识产权的商品或发布涉嫌侵犯第三方知识产权的信息。 若卖家发布涉嫌侵犯第三方知…

从股票市场选择配对的股票:距离计算方法

我们来看看如何定义距离的计算方法。 回想一下,在共同趋势模型中,协整的必要条件是从共同趋势得到的新息序列必须完全相关。APT中的共同因子回报就理解成是从共同趋势得到的新息序列,因此,新息序列之间的相关系数就是共同因子回报…

网关性能大PK,Spring Cloud Gateway让人大失所望

现在的架构基本都是使用微服务的,而网关作为微服务的统一门户在架构模式中用得越来越多,API网关是所有客户端的单一入口点。 API网关模式是微服务体系结构的一个很好的起点,因为它能够将特定的请求路由到我们从整体上分离的不同服务。事实上…

嘿嘿嘿,10个我经常逛的“小网站”,不骗人

反思一下,为什么你会点进来~ 咳咳,步入正题。 工欲善其事必先利其器,你们的收藏夹里收藏了多少“小网站”?今天和大家分享10个我压箱底的效率工具/平台,现在用不上不要紧,赶紧收藏最关键! 1.G…

【产品设计】APP常见的6种图片浏览模式

六种是指比较常见的图片浏览模式,是在这四种的基础上加上手势来实现另一种读图方式,这里不绝对说就这么几种,那么就谈谈个人对每种图片浏览模式说说自己在实际使用和工作中的一些理解,以及这些模式在实际设计中,哪一种…

智能聊天机器人––ChatGPT初体验

最近几天,由OpenAI公司发布的ChatGPT聊天机器人火了,小杨也怀着对新鲜事物的好奇,亲自体验了一下这个火爆全网,让人沉迷其中无法自拔的ChatGPT聊天机器人,经过体验,我只想用一个字来表达我的感受&#xff0…

【LeetCode每日一题】——142.环形链表 II

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【题目进阶】九【时间频度】十【代码实现】十一【提交结果】一【题目类别】 链表 二【题目难度】 中等 三【题目编号】 142.环形链表 II 四【题目描述】 …

Java百度地图全套教程(地图找房、轻骑小程序、金运物流等)

课程简介: 本课程基于百度地图技术,将企业项目中地图相关常见应用场景的落地实战,包括有地图找房、轻骑小程序、金运物流等。同时还讲了基于Netty实现高性能的web服务,来处理高并发的问题。 学完本课程能够收获:百度…

支持本地挂载的网盘文件列表工具AList

什么是 Alist? AList 是一个支持多存储的文件列表程序,使用 Gin 框架和 Solidjs 库。可以将常见的 18 种网盘整合在一起,并支持 WebDAV 客户端访问。 之前老苏写过一篇 Alist, 但此 Alist 非彼 Alist,之前的 A 应该是 …

React基础知识(React基本使用、JSX语法、React模块化与组件化)(一)

系列文章目录 文章目录系列文章目录一、React简介1.1 React的特点1.2 React高效的原因二、React基本使用2.1 引入react相关js库2.2 创建虚拟DOM的两种方法2.3 虚拟DOM和真实DOM三、JSX基本使用3.1 jsx使用四、React模块化与组件化4.1 函数式组件4.2 类式组件一、React简介 1.英…

Kafka消费者组消费进度监控

针对Kafka消费者,重要的就是监控消费进度或者是消费的滞后程度,有个专业名词 消费者 Lag 或 Consumer Lag。 滞后程度(Consumer Lag)是指消费者当前落后生产者的程度。比如Kafka 生产者向某主题成功生产了 100 万条消息&#xff0…

一个.NetCore前后端分离、模块化、插件式的通用框架

今天给大家推荐一个基于.NET 6实现的快速开发平台。采用模块化插件式开发,前后端分离,开箱即用。 项目简介 这是一个开箱即用的快速开发平台,前后端分离架构,支持插件式开发,支持工作流、可视化表单功能。系统基础功…

Qt 快速读写Excel指南

Qt Windows 下快速读写Excel指南 很多人搜如何读写excel都会看到用QAxObject来进行操作,很多人试了之后都会发现一个问题,就是慢,非常缓慢!因此很多人得出结论是QAxObject读写excel方法不可取,效率低。 后来我曾试过用…

网络攻击损失不容小觑

据研究数据显示,2022年数据泄露给企业造成的平均损失为435万美元;如果是勒索软件攻击,损失将增加到454万美元。当然这只是估计,在某些国家或地区平均损失更高,比如在美国,损失接近1000万美元。 此外&#x…

如何制作并使用动静态库

制作并使用动静态库🏞️1. 动静态库概念🌁2. 如何制作动静态库📖2.1 制作静态库📖2.2 制作动态库🌠3. 如何使用动静态库📖3.1 使用静态库📖3.2 使用动态库🍁4. 动态库的加载原理&…

Mybatis-plus实战项目演示+自定义元数据对象处理器+ws

目录 一,mybatis-plus实战一 1.导入依赖 2.application.yml配置 3.实体类 4.mapper 5.service层 6.启动类上配置 二,mybatis-plus实战二 1.导入依赖 2.application.yml配置 3.实体类 2.mapper 3.service 4.分页配置 5.放一个在controller层…

jeecg-boot中实现跳过登录验证访问其他vue页面

大家好,我是雄雄,欢迎关注微信公众号,雄雄的小课堂。 前言 大家都知道,我们正常的项目,都做了访问限制,也就是,只有当用户登录本平台后,才能让用户访问别的页面,否则默认…