当前位置: 首页 > article >正文

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

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//添加\nprintWriter.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.发送请求//让请求的结尾有\nprintWriter.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.lryc.cn/news/2385519.html

相关文章:

  • LangChain构建RAG的对话应用
  • 目标检测DN-DETR(2022)详细解读
  • 嵌入式培训之系统编程(四)进程
  • 天文数据处理:基于CUDA的射电望远镜图像实时去噪算法(开源FAST望远镜数据处理代码解析)
  • VS编码访问Mysql数据库
  • 一周学会Pandas2 Python数据处理与分析-Pandas2数据合并与对比-pd.merge():数据库风格合并
  • leetcode 862. 和至少为 K 的最短子数组
  • CodeBuddy 实现图片转素描手绘工具
  • 3.8.2 利用RDD计算总分与平均分
  • 29-FreeRTOS事件标志组
  • 天地图实景三维数据分享(江苏)
  • Jenkins的Pipline中有哪些区块,以及其它知识点整理
  • 「EMD/EEMD/VMD 信号分解方法 ——ECG信号处理-第十四课」2025年5月23日
  • 二叉树层序遍历6
  • 【论文精读】2023 AAAI--FastRealVSR现实世界视频超分辨率(RealWorld VSR)
  • IPython 常用魔法命令
  • 数据同步自动化——如何用Python打造高效工具?
  • 开源与闭源之争:AI时代的创新博弈与未来抉择
  • flutter dart class语法说明、示例
  • Java虚拟机 - 程序计数器和虚拟机栈
  • SpringMVC04所有注解按照使用位置划分| 按照使用层级划分(业务层、视图层、控制层)
  • 新能源汽车产业链图谱分析
  • 如何在PyCharm2025中设置conda的多个Python版本
  • 005 深度优先搜索(DFS)算法详解:图解+代码+经典例题
  • maven快速上手
  • cplex12.9 安装教程以及下载
  • 甘特图实例 dhtmlxGantt.js
  • AMD硬件笔试面试题型解析
  • 视频剪辑 VEGAS - 配置视频片段保持原长宽比
  • 力扣 54 .螺旋矩阵