计算机网络(3)——传输层

news2025/5/25 18:29:19

1.概述

1.1 传输层的服务和协议

(1)传输层为允许在不同主机(Host)上的进程提供了一种逻辑通信机制
(2)端系统(如手机、电脑)运行传输层协议

  • 发送方:将来自应用层的消息进行封装并向下提交给 网络层
  • 接收方:将接收到的Segment进行组装并向上提交给应用层

(3)传输层可以为应用提供多种协议,如UDP、TCP

逻辑通信机制:传输层提供的一种抽象服务,它使得不同主机上的应用程序能够直接进行数据传输,而无需关注底层网络的实现细节

1.2 传输层&网络层关系

  • 网络层:提供主机之间的逻辑通信机制;传输层:提供应用程序之间的逻辑通信机制
  • 传输层位于网络层之上,依赖于网络层提供的服务,并对网络层服务进行(可能的)增强

1.3 传输层协议

用户数据报协议(UDP): 可靠、按序的交付服务

  • 拥塞控制
  • 流量控制
  • 连接建立

传输控制协议(TCP):不可靠的交付服务

  • 基于尽力而为的网络层,没有做(可靠性方面的)扩展

两种协议均不保证:

  • 延迟
  • 带宽

1.4 套接字(Socket)

概念:套接字作为应用层和传输层之间的接口,充当了应用进程与网路协议栈(如TCP/IP协议栈)之间的桥梁
作用:

  • 1.提供端点通信:套接字为每个通信进程提供了一个唯一的标识符(IP地址+端口号),这使得不同主机上的应用进程能够相互识别并进行通信
  • 2.封装传输层功能:应用进程通过套接字提供的接口进行数据的发送和接收(send和receive函数);对于TCP套接字,套接字接口提供了来连接管理的功能(connect、accept、close等函数)
  • 3.简化网络编程:套接字将底层网络协议的复杂性进行疯转,应用程序不需要了解TCP/IP协议栈的具体实现细节,只需要调用套结字提供的功能就可以进行网络通信

下面是基于Java中的套接字实现的TCP回显服务器。Java中的Socket是基于操作系统提供的套接字实现的,并进行了进一步的封装

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.concurrent.*;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 38917
 * Date: 2025-03-18
 * Time: 17:29
 */
public class TCPEchoSever {
    //
    private final ServerSocket socket;
    //线程池
    private final ThreadPoolExecutor executor = new ThreadPoolExecutor(4,8,1,
            TimeUnit.MINUTES, new ArrayBlockingQueue<>(1024),Executors.defaultThreadFactory(),
            new ThreadPoolExecutor.CallerRunsPolicy());
    //
    public TCPEchoSever(int port) throws IOException {
        socket = new ServerSocket(port);
    }
    //启动服务器
    protected void start() throws IOException {
        System.out.println("服务器启动");
        while (true){
            //将服务器和客户端连接
            //accept()有阻塞效果,等待客户端建立联系
            Socket clientSocket = socket.accept();
            //每与一个客户端建立连接,都创建一个线程来执行客户端的请求
            executor.execute(() -> {
                try {
                    processConnection(clientSocket);
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            });
        }
    }
    //
    public void processConnection(Socket clientSocket) throws IOException {
        System.out.printf("[%s:%d] 服务器上线\n",clientSocket.getInetAddress(),clientSocket.getPort());
            //inputStream从网卡读数据
        try(InputStream inputStream = clientSocket.getInputStream();
            //OutputStream往网卡写数据
            OutputStream outputStream = clientSocket.getOutputStream()) {
            //从网卡读数据
            //byte[] array = new byte[1024];int ret = inputStream.read(array);
            PrintWriter printWriter = new PrintWriter(outputStream);
            Scanner scanner = new Scanner(inputStream);
            while (true){
                //读取完毕,当客户端下线的时候产生
                //在用户输入之前,hasNext()有阻塞效果
                //当客户端断开连接时,scanner.hasNext()返回false并中断循环
                if (!scanner.hasNext()){
                    System.out.printf("[%s:%d] 客户端下线\n",clientSocket.getInetAddress(),clientSocket.getPort());
                    break;
                }
                //1.读取请求并解析
                //用户传过来的请求必须带有空白符,没有的话就会阻塞
                String request = scanner.next();
                //2.计算响应
                String response = process(request);
                //3.返回响应
                //outputStream.write(response.getBytes(),0,response.getBytes().length);//这个方式不方便添加空白符
                //通过PrintWriter来封装outputStream
                //添加\n
                printWriter.println(response);
                //刷新缓冲区
                printWriter.flush();
                //打印日志
                System.out.printf("[%s:%d] request:%s,response:%s\n",clientSocket.getInetAddress(),
                        clientSocket.getPort(),request,response);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }finally {
            clientSocket.close();
        }
    }
    //计算响应
    protected String process(String request) {
        return request;
    }
    //
    public static void main(String[] args) throws IOException {
        TCPEchoSever sever = new TCPEchoSever(9090);
        sever.start();
    }
}



import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 38917
 * Date: 2025-03-18
 * Time: 17:30
 */
public class TCPEchoClient {
    private final Socket socket;
    //
    public TCPEchoClient(String severIp,int port) throws IOException {
        socket = new Socket(severIp,port);
    }
    //
    public void start(){
        System.out.println("客户端启动");
        try(InputStream inputStream = socket.getInputStream();
            OutputStream outputStream = socket.getOutputStream()) {
            //读取控制台
            Scanner scannerConsole = new Scanner(System.in);
            Scanner scannerNetWork = new Scanner(inputStream);
            PrintWriter printWriter = new PrintWriter(outputStream);
            while (true){
                System.out.print("->");
                //在用户输入之前,hasNext()有阻塞效果
                if (!scannerConsole.hasNext()){
                    break;
                }
                //1.从控制台输入请求
                String request = scannerConsole.next();
                //2.发送请求
                //让请求的结尾有\n
                printWriter.println(request);
                //刷新缓冲区
                printWriter.flush();
                //3.从服务器读取响应
                String response = scannerNetWork.next();
                //4.将响应打印到控制台
                System.out.println(response);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    //
    public static void main(String[] args) throws IOException {
        TCPEchoClient client = new TCPEchoClient("127.0.0.1",9090);
        client.start();
    }
}

2.复用&分用

复用:在发送端,传输层将从不同应用进程接收到的数据合并成一个数据流,然后向下提交给网络层的过程。具体过程如下:

  • 1.接收多个应用进程的数据:在一台主机上,可能有多个应用进程同时进行网络通信,例如浏览器、邮件客户端、文件传输等
  • 2.分配端口号:每个应用进程都会被分配一个唯一的端口号,用于标识数据来源
  • 3.封装数据:传输层将来自不同应用进程的数据分割成适当大小的数据段(Segment),并在每个数据段的头部添加源端口号和目的端口号等信息
  • 4.合并数据流:这些数据段被合并成一个数据流,传递给网络层进行进一步传输

分用(解复用):在接收端,传输层将来自网络层的数据根据端口号分解,并将其正确地向上提交给对应的应用进程的过程。具体过程如下:

  • 1.接收数据流:网络层将接收到的数据传递给传输层
  • 2.解析端口号:传输层解析每个数据段的头部信息,提取目的端口号
  • 3.分配数据:根据目的端口号,传输层将数据段分配给相应的应用进程 在这里插入图片描述

3.UDP

3.1 协议格式


Java EE(14)——网络原理——UDP&TCP数据报的结构

3.2 特点解析

  • 1.无连接:UDP的套接字在传输数据之前不需要建立连接,发送端直接键该数据发送给接收端,无需进行三次握手
  • 2.不可靠传输:不保证数据的可靠传输,也不提供错误检测和纠正机制,数据达到接收端时可能会丢失、重复或乱序达到,需要应用程序自行处理
  • 3.无序传输:不保证数据的顺序,接收端可能会接收乱序的数据,应用程序需要自行排序
  • 4.无流量控制:不提供流量控制机制,发送端可以以任意速率发送数据,这可能导致网络拥塞和数据丢失
  • 5.无拥塞控制:不会根据网络状况调整发送速率,在网络拥塞时可能会加剧拥塞问题

Question:传输层中已经有了TCP协议,UDP存在的意义是什么?
Answer:

  • 1.低延迟:由于没有建立连接和确认应答等机制,UDP的延迟较低
  • 2.低开销:UDP头部仅8字节,TCP头部20字节
  • 3.简单性:UDP协议远远比TCP协议简单,易于实现和维护
  • 4.适合实时应用:适合对实时性要求高、对可靠性要求低的应用,如视频、直播、DNS等

4.TCP

4.1 协议格式


Java EE(14)——网络原理——UDP&TCP数据报的结构

4.2 特点解析

Java EE(15)——网络原理——TCP协议解析

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

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

相关文章

LangChain构建RAG的对话应用

目录 Langchain是什么&#xff1f; LangSmith是什么&#xff1f; ​编辑 使用Python构建并使用AI大模型 数据解析器 提示模版 部署 记忆功能 Chat History -- 记忆 代码执行流程&#xff1a; 流式输出 构建向量数据库和检索器 检索器 代码执行流程 LLM使用检索器…

目标检测DN-DETR(2022)详细解读

文章目录 gt labels 和gt boxes加噪query的构造attention maskIS&#xff08;InStability&#xff09;指标 在DAB-Detr的基础上&#xff0c;进一步分析了Detr收敛速度慢的原因&#xff1a;二分图匹配的不稳定性&#xff08;也就是说它的目标在频繁地切换&#xff0c;特别是在训…

嵌入式培训之系统编程(四)进程

一、进程的基本概念 &#xff08;一&#xff09;定义 进程是一个程序执行的过程&#xff08;也可以说是正在运行的程序&#xff09;&#xff0c;会去分配内存资 源&#xff0c;cpu的调度&#xff0c;它是并发的 &#xff08;二&#xff09;PCB块 1、PCB是一个结构体&#x…

天文数据处理:基于CUDA的射电望远镜图像实时去噪算法(开源FAST望远镜数据处理代码解析)

一、射电天文数据处理的挑战与CUDA加速的必要性 作为全球最大的单口径射电望远镜&#xff0c;中国天眼&#xff08;FAST&#xff09;每秒产生38GB原始观测数据&#xff0c;经预处理后生成数千万张图像。这些数据中蕴含的脉冲星、中性氢等天体信号常被高斯白噪声、射频干扰&…

VS编码访问Mysql数据库

安装 MySQL Connector/C 的开发包 libmysqlcppconn-dev是 MySQL Connector/C 的开发包&#xff0c;它的主要用途是让 C 开发者能够方便地在应用程序中与 MySQL 数据库进行交互。它提供了以下功能&#xff1a; 数据库连接&#xff1a;通过标准的 C 接口连接到 MySQL 数据库。S…

一周学会Pandas2 Python数据处理与分析-Pandas2数据合并与对比-pd.merge():数据库风格合并

锋哥原创的Pandas2 Python数据处理与分析 视频教程&#xff1a; 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili pd.merge()&#xff1a;数据库风格合并 **核心功能**&#xff1a;基于列值&#xff08;类似 SQL JOIN&#xff09;合…

CodeBuddy 实现图片转素描手绘工具

本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 前言 最近在社交媒体上&#xff0c;各种素描风格的图片火得一塌糊涂&#xff0c;身边不少朋友都在分享自己的 “素描照”&#xff0c;看着那些黑白线条勾勒出的独特韵味&a…

3.8.2 利用RDD计算总分与平均分

在本次实战中&#xff0c;我们利用Spark的RDD完成了成绩文件的总分与平均分计算任务。首先&#xff0c;准备了包含学生成绩的文件并上传至HDFS。接着&#xff0c;通过交互式方式逐步实现了成绩的读取、解析、总分计算与平均分计算&#xff0c;并最终输出结果。此外&#xff0c;…

29-FreeRTOS事件标志组

一、概述 事件是一种实现任务间通信的机制&#xff0c;主要用于实现多任务间的同步&#xff0c;但事件通信只能是事件类型的通信&#xff0c;无数据传输。与信号量不同的是&#xff0c;它可以实现一对多&#xff0c;多对多的同步。 即一个任务可以等待多个事件的发生&#xff1…

「EMD/EEMD/VMD 信号分解方法 ——ECG信号处理-第十四课」2025年5月23日

一、引言 上一节&#xff0c;我们介绍了希尔伯特黄变换&#xff08;HHT&#xff09;及其经验模态分解&#xff08;EMD&#xff09;的相关内容&#xff0c;这一节&#xff0c;我们继续拓展EMD分解技术&#xff0c;补充介绍集合经验模态分解&#xff08;Ensemble Empirical Mode …

二叉树层序遍历6

INT_MIN的用法&#xff1a; INT_MIN是C/C 中的一个宏常量 &#xff0c;在 <limits.h> &#xff08;C 中也可使用 <climits> &#xff09;头文件中定义&#xff0c;代表 int 类型能表示的最小整数值 。其用法主要体现在以下方面&#xff1a; 1.初始化变量 …

【论文精读】2023 AAAI--FastRealVSR现实世界视频超分辨率(RealWorld VSR)

文章目录 一、摘要二、Method2.1 现象&#xff08;问题&#xff09;--对应文中隐状态的分析&#xff08;Analysis of Hidden State&#xff09;2.2 怎么解决 --对应文中Framework2.2.1 整体流程&#xff1a;2.2.2 HSA模块怎么工作&#xff1f;2.2.2.1 隐藏状态池2.2.2.2 选择性…

IPython 常用魔法命令

文章目录 IPython 魔法命令&#xff08;Magic Commands&#xff09;一、系统与文件操作1. %ls2. %cd​​和%pwd3. %%writefile​​4. %run 二、性能分析与计时1. %timeit2. %prun​​3. ​​%%timeit 三、代码处理与交互1. %load2. ​​%edit3. ​​%store 四、调试与诊断2. ​…

Java虚拟机 - 程序计数器和虚拟机栈

运行时数据结构 Java运行时数据区程序计数器为什么需要程序计数器执行流程虚拟机栈虚拟机栈作用虚拟机栈核心结构运行机制 Java运行时数据区 首先介绍Java运行时数据之前&#xff0c;我们要了解&#xff0c;对于计算机来说&#xff0c;内存是非常重要的资源&#xff0c;因为内…

新能源汽车产业链图谱分析

1. 产业定义 新能源汽车是指采用非常规的车用燃料作为动力来源&#xff0c;综合车辆的动力控制和驱动方面的先进技术&#xff0c;形成的具有新技术、新结构、技术原理先进的汽车。 新能源车包括四大类型&#xff1a;混合动力电动汽车&#xff08;HEV&#xff09;、纯电动汽车…

如何在PyCharm2025中设置conda的多个Python版本

前言 体验的最新版本的PyCharm(Community)2025.1.1&#xff0c;发现和以前的版本有所不同。特别是使用Anaconda中的多个版本的Python的时候。 关于基于Anaconda中多个Python版本的使用&#xff0c;以及对应的Pycharm&#xff08;2023版&#xff09;的使用&#xff0c;可以参考…

maven快速上手

之前我们项目如果要用到其他额外的jar包&#xff0c;需要自己去官网下载并且导入。但是有maven后&#xff0c;直接在maven的pom.xml文件里用代码配置即可&#xff0c;配置好后maven会自动帮我们联网下载并且会自动导入该jar包 在右边的maven中&#xff0c;我们可以看到下载安装…

cplex12.9 安装教程以及下载

cplex 感觉不是很好找&#xff0c;尤其是教育版&#xff0c;我这里提供一个版本&#xff0c;在下面的图可以看到&#xff0c;不仅可以配置matlab&#xff0c;也可以配置vs,现在拿vs2017来测试一下&#xff0c;具体文件的文件有需要的可以复制下面的链接获取 我用网盘分享了「c…

甘特图实例 dhtmlxGantt.js

本文介绍了如何使用dhtmlxGantt库创建一个基础的甘特图示例&#xff0c;并对其进行汉化和自定义配置。首先&#xff0c;通过引入dhtmlxgantt.css和dhtmlxgantt.js文件初始化甘特图。接着&#xff0c;通过设置gantt.i18n.setLocale("cn")实现核心文本的汉化&#xff0…

视频剪辑 VEGAS - 配置视频片段保持原长宽比

VEGAS 配置视频片段保持原长宽比 右击视频片段 -> 选择【开关】 -> 勾选【保持长宽比】 右击视频片段 -> 点击【属性】 -> 弹出【属性】窗口 点击【媒体】 -> 选择【像素宽高比】为【1,0000&#xff08;方形&#xff09;】