计算机网路第3章-运输层

概述和运输层服务

运输层协议为运行在不同主机上的应用进程提供了逻辑通信,从应用程序角度看,通过使用逻辑通信,就好像运行在不同主机上的进程直接相连在一起一样。

运输层和网络层的关系

网络层提供主机之间的通信,而运输层提供了不同主机上的不同进程的通信。

运输层只负责将自己的报文段提交给网络层或从网络层下载报文段,并不负责报文段在网络中的运输。

因特网运输层概述

因特网为用户提供了两种基本的运输层协议:

TCP(传输控制协议)和UDP(用户数据报协议)

其中,UDP和TCP最基本的责任是,将两个端系统间IP的交付服务扩展为运行在端系统上两个进程之间的交付服务。

将主机间交付扩展到进程间交付被称为运输层的多路复用与多路分解。

UDP和TCP也可以在报文段首部中包括差错检查字段,以提供完整性检查。

其中,进程到进程的数据交付和差错检查是两种最低限度的运输层服务,也是UDP只能提供的两种服务。

多路复用与多路分解

在接收端,运输层检查这些字段,标识出应用进程端口号,进而将报文段定向到该套接字。

将运输层报文段中的数据交付到正确的套接字的工作称为多路分解。

从源主机中不同套接字收集数据块,并为每块封装首部信息生成报文包,然后将报文报提交给网络层,这些工作被称为多路复用。

运输层报文段的基本组成

1.套接字有唯一的标识符。(即主机IP和端口号)

2.报文报有源端口号字段,目的端口号字段。(UDP报文段只有这两个,TCP还包括源IP字段和目的IP字段。)

其中端口号是一个16比特的数值,范围在0~65535之间。

其中0~1023是周知端口号,这是保留给某些众所周知的应用所使用的

诸如HTTP端口号是80。

无连接的多路复用与多路分解

即UDP所提供的多路复用和多路分解。

一个UDP套接字是由一个二元组全面标识的,该二元组包含一个目的IP和一个目的端口号

因此,如果两个UDP报文段拥有不同的源IP地址,但是具有相同的目的IP和目的端口号,这两个报文段就会被同一个UDP套接字所接收。

源端口号的用途是什么呢?

很简单,源端口号/源IP用来返回一个响应报文,响应报文中的目的IP和目的端口号就是请求报文的源IP和源端口号。

面向连接的多路复用和多路分解

即TCP所提供的多路复用和多路分解。

TCP与UDP一个细微区别就是,TCP是由一个四元组唯一标识的(目的IP、目的端口号、源IP、源端口号)这四个部分,只要有一个不同,那么就被TCP认为是两个不同的报文段,需要被两个独立的TCP套接字所接收。

下面,我们来阐述一个TCP报文段从网路到达目的主机的一个过程。

1.TCP服务器应用程序有一个“欢迎套接字”,该套接字在12000端口号上等待用户发来的连接建立请求。

2.现在有两条报文段被发送过来,两条报文段中,只有源IP不一样,其余的源端口号、目的IP、目的端口号皆相同。

3.欢迎套接字接收这两个报文段,同时进行分析判断两个报文段是否一致,因为两个报文段的源IP不一样,所以被认为是两个不同的报文段!

4.欢迎套接字创建两个新的TCP套接字,分别接收两个TCP连接请求报文段。

无连接运输:UDP

UDP只是做了运输协议所能做的最少工作:(多路复用/分解、差错检测)

实际上,如果应用程序使用的是UDP协议,那么UDP将会直接跟IP打交道。

值得注意的是,UDP发送报文段之前,发送方和接收方并没有握手,所以UDP也被称为是无连接的。

DNS就是一个常见的使用UDP协议的例子。

UDP的优点

1.关于发送什么数据以及何时发送的应用层控制更为精细

采用UDP的时候,只要应用程序将数据塞进UDP,UDP就会把数据打包进UDP报文段并且立即传送给网络层。

同时UDP相较于TCP没有拥塞控制机制,因此UDP可以比TCP有更加强大的性能体验,因为它并不需要额外的性能支出,用来提供额外的服务(拥塞控制机制、安全性保护等)

2.无需连接建立

TCP在开始连接之前,需要经过三次握手。

而UDP无需握手,即不需要构建连接,因此省去了建立连接的时间。

为此UDP协议没有建立连接的时延,这对于一些时延要求很低的应用程序,是必不可少的。

3.无连接状态

TCP需要在端系统中维护连接状态,包括接收和发送缓存、拥塞控制参数以及序号与确认号的参数。

而UDP不需要提供这些参数,因此UDP相较于TCP一般可以保持更多的活跃用户。

4.分组首部开销小

UDP报文段首部仅有:

目的IP和目的端口号。

而TCP报文段首部包含:

目的IP和目的端口号、源IP和源端口号。

综上,我们可以明白DNS为什么要使用UDP协议了,因为UDP协议没有建立连接的时延,这对于DNS来说非常重要,如果DNS采用TCP协议,那么DNS发送一个主机名查询报文段,将会获得较大的时延,这对于用户的体验是非常糟糕的。

虽然UDP协议不保证数据传输是可靠的,但这对于DNS是可容忍的,当使用UDP协议时,查询报文返回一个出错的数据后,DNS可以选择拒绝将出错数据传送给应用程序,或者将出错数据传送给应用程序并且给出报错信息。

不过值得注意的是,UDP虽然并不提供安全性保证,但可以在应用程序开发的时候,由开发人员在应用程序中内置安全性保护措施,从而使UDP也具有保护措施。

UDP报文段结构

UDP首部只有四个字段,每个字段占用两个字节。

长度字段指明了UDP报文段中的字节总数(首部加数据)。

检验和字段用来验证UDP报文段是否出错。

UDP检验和

UDP检验和提供了差错检测功能,但是这种功能仅仅能判断报文段是否出错,并不能判断出是哪一位字节或者哪些位字节出错,且不具备纠错的能力。

为此在UDP套接字检测到UDP报文段出错后,只能选择丢弃该报文段,或者将该报文段仍提交给应用数据,但附加一个出错信息用来应用程序提供报错信息。

UDP检验和的演算

UDP接收方对报文段中的所有16比特字的和进行反码运算,同时任何溢出都会被直接丢弃。

例如,下面我们由3个16比特的字:

0110 0110 0110 0000

0101 0101 0101 0101

1000 1111 0000 1100

其中按两个的和是:

1011 1011 1011 0101

再将这个和与上面的第三个比特相加,得:

0100 1010 1100 0010

再将这个和取反:

1011 0101 0011 1101

这就变成了检验和。

在接收方UDP套接字中,如果全部的四个比特字(原先的三个比特字和检验和)加在一起,如果该分组中没有出现错误,那么该和会是:

1111 1111 1111 1111

即全是1,但若16位中的某一位或多位出现了0,那么该分组中就出现了差错。

为什么UDP要具有差错检测

首先,如果端到端数据传输要提供差错检测(即不同主机上的不同应用进程传输),那么UDP就必须在端到端基础上在运输层提供差错检测。

这是一个在系统设计中被称为颂的端到端原则

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文献阅读(207)FPGA HBM

题目:HBM Connect: High-Performance HLS Interconnect for FPGA HBM时间:2021会议:FPGA研究机构:UCLA Jason Cong 题目:Demystifying the Memory System of Modern Datacenter FPGAs for Software Programmers throug…

网络拓扑图怎么画最好?

你们好,我的网工朋友。 好久没和你们聊拓扑图了,群里总是不乏有人问,拓扑图怎么设计,怎么配置,或者让大佬看看自己做的这图有没有啥问题的…… 画拓扑图的方式有很多,在线软件,Visio&#xff…

JVM 基础篇:类加载器

一.了解JVM 1.1什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟计算机功能来实现的,JVM屏蔽了与具体操作系统平台相关的信息,Java程序只需…

nodejs+wasm+rust debug及性能分析

文章目录 背景v8引擎自带的profilelinux的perf采集wasm三方库性能分析编译debug版本wasmrust程序debug调试异常模型正常模型结论优化 参考 Node使用火焰图优化CPU爆涨 - 掘金 【Node.js丨主题周】理解perf 与火焰图-腾讯云开发者社区-腾讯云 Easy profiling for Node.js Applic…

手搭手zabbix5.0监控redis7

Centos7安装配置Redis7 安装redis #安装gcc yum -y install gcc gcc-c #安装net-tools yum -y install net-tools #官网https://redis.io/ cd /opt/ wget http://download.redis.io/releases/redis-7.0.4.tar.gz 解压至/opt/目录下 tar -zxvf redis-7.0.4.tar.gz -C /opt/ #…

ssm+vue的软考系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频: ssmvue的软考系统(有报告)。Javaee项目,ssm vue前后端分离项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构&#xff…

Java反射实体组装SQL

之前在LIS.Core定义了实体特性,在LIS.Model给实体类加了表特性,属性特性,外键特性等。ORM要实现增删改查和查带外键的父表信息就需要解析Model的特性和实体信息组装SQL来供数据库驱动实现增删改查功能。 实现实体得到SQL的工具类&#xff0c…

现在大火的低代码是怎么回事?进来聊聊低代码

一、前言 开发过程中,只是觉得前端后端合起来,有很多冗余信息,被代码一遍遍重复表达,是一件很枯燥、无聊的事情。 这些枯燥的重复工作,完全可以由机器来做,以便解放出我们的时间,来做更有价值的…

【蓝桥每日一题]-动态规划 (保姆级教程 篇11)#方格取数2.0 #传纸条

目录 题目:方格取数 思路: 题目:传纸条 思路: 题目:方格取数 (跑两次) 思路: 如果记录一种方案后再去跑另一个方案,影响因素太多了,所以两个方案要同时开…

Java Spring 通过 AOP 实现方法参数的重新赋值、修改方法参数的取值

AOP 依赖 我创建的项目项目为 SpringBoot 项目 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.3</version></parent><dependency><groupId…

Linux:firewalld防火墙-基础使用(2)

上一章 Linux&#xff1a;firewalld防火墙-介绍&#xff08;1&#xff09;-CSDN博客https://blog.csdn.net/w14768855/article/details/133960695?spm1001.2014.3001.5501 我使用的系统为centos7 firewalld启动停止等操作 systemctl start firewalld 开启防火墙 systemct…

Java面试(基础篇)——解构Java常见的基础面试题 结合Java源码分析

fail-safe 和fail-fast机制分别有什么作用&#xff1f; Fail-fast&#xff1a;快速失败 Fail-fast &#xff1a; 表示快速失败&#xff0c;在集合遍历过程中&#xff0c;一旦发现容器中的数据被修改了&#xff0c;会立刻抛出ConcurrentModificationException 异常&#xff0c…