百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

图解TCP/UDP原理(tcp,udp)

nanshan 2025-03-20 17:07 13 浏览 0 评论

引言:TCP UDP在OSI的七层模型,属于传输层,在通信行业,在软件开发行业,都是必须熟知的,那我们怎么去了解这两个呢。

TCP和UDP

TCP和UDP是传输层的两个重要的协议

TCP(Transmission Control Protocol) 传输控制协议

UDP(User Datagram Protocol)用户数据报协议

TCP的主要特点:

  1. 面向连接
  2. 每一条TCP连接只能是点对点的(一对一)
  3. 提供可靠交付的服务
  4. 提供全双工通信
  5. 面向字节流

UDP的主要特点:

  1. 无连接
  2. 尽最大努力交付
  3. 面向报文
  4. 无拥塞控制
  5. 支持一对一、一对多、多对一和多对多的交互通信
  6. 首部开销小(只有4个字段:源端口、目的端口、长度、检验和)

TCP进行拥塞控制的算法有4种

慢开始(slow-start)、拥塞避免(congestion avoidance)、快重传(fast retransmit)、快恢复(fast recovery)

TCP 传送的数据单位协议是 TCP 报文段(segment)。

UDP 传送的数据单位协议是 UDP 报文或用户数据报。

TCP 不提供广播或多播服务

UDP的首部格式

  • 源端口:2个字节
  • 目的端口:2个字节
  • 长度:2个字节
  • 检验和:2个字节

什么是端口

硬件端口与软件端口

在协议栈层间的抽象的协议端口是软件端口。

路由器或交换机上的端口是硬件端口。

硬件端口是不同硬件设备进行交互的接口,

而软件端口是应用层的各种协议进程与运输实体进行层间交互的一种地址。

两个计算机中的进程要互相通信,不仅必须知道对方的 IP 地址(为了找到对方的计算机),

而且还要知道对方的端口号(为了找到对方计算机中的应用进程)。

服务器端使用的端口号

熟知端口,数值一般为 0~1023。

登记端口号,数值为 1024~49151,为没有熟知端口号的应用程序使用的。使用这个范围的端口号必须在 IANA 登记,以防止重复。

客户端使用的端口号

又称为短暂端口号,数值为 49152~65535,留给客户进程选择暂时使用。

常见熟知端口:

FTP(File Transfer Protocol)文件传输协议 :21

TELNET远程终端协议:23

SMTP(Simple Mail Transfer Protocol)简单邮件传送协议:25

DNS(Domain Name System)域名系统:53

TFTP(Trivial File Transfer Protocol)简单文件传送协议:69

HTTP(HyperText Transfer Protocol)超文本传送协议:80

SNMP(Simple Network Management)简单网络管理协议:161

SNMP(trap):162

TCP UDP的通信方式

虽然在 UDP 之间的通信要用到其端口号,但由于 UDP 的通信是无连接的,因此不需要使用套接字。

TCP 连接的端点不是主机,不是主机的IP 地址,不是应用进程,也不是运输层的协议端口。TCP 连接的端点叫做套接字 (socket) 或插口。

每一条 TCP 连接唯一地被通信两端的两个端点(即两个套接字)所确定。

TCP 连接 ::= {socket1, socket2} = {(IP1: port1),(IP2: port2)}

可靠传输的工作原理:

  1. 停止等待协议
  2. 连续ARQ协议

1)“停止等待”

就是每发送完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组。

出现差错的情况:

在接收方 B 会出现两种情况:

B 接收 M1 时检测出了差错,就丢弃 M1,其他什么也不做(不通知 A 收到有差错的分组)。M1 在传输过程中丢失了,这时 B 当然什么都不知道,也什么都不做。在这两种情况下,B 都不会发送任何信息。

如何保证 B 正确收到了 M1 呢?

解决方法:超时重传

A 为每一个已发送的分组都设置了一个超时计时器。

A 只要在超时计时器到期之前收到了相应的确认,就撤销该超时计时器,继续发送下一个分组 M2 。

自动重传请求 ARQ (Automatic Repeat reQuest)。意思是重传的请求是自动进行的,接收方不需要请求发送方重传某个出错的分组。

2) 连续ARQ协议:

发送方维持的发送窗口,它的意义是:位于发送窗口内的分组都可连续发送出去,而不需要等待对方的确认。这样,信道利用率就提高了。

连续 ARQ 协议规定,发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。

TCP运输连接建立:

TCP 是面向连接的协议。

运输连接有三个阶段:

  1. 连接建立
  2. 数据传送
  3. 连接释放

TCP 建立连接的过程叫做三报文握手

A 的 TCP 向 B 发出连接请求报文段,其首部中的同步位 SYN = 1,并选择序号 seq = x,表明传送数据时的第一个数据字节的序号是 x。
B 的 TCP 收到连接请求报文段后,如同意,则 发回确认。
B 在确认报文段中应使 SYN = 1,使 ACK = 1,其确认号ack = x + 1,自己选择的序号 seq = y。
A 收到此报文段后向 B 给出确认,其 ACK = 1, 确认号 ack = y +1。
A 的 TCP 通知上层应用进程,连接已经建立。
B 的 TCP 收到主机 A 的确认后,也通知其上层应用进程:TCP 连接已经建立。

数据传输结束后,通信的双方都可释放连接。

TCP 连接释放过程是四报文握手。

数据传输结束后,通信的双方都可释放连接。
 现在 A 的应用进程先向其 TCP 发出连接释放报文段,并停止再发送数据,主动关闭 TCP 连接。
 A 把连接释放报文段首部的 FIN = 1,其序号 seq = u,等待 B 的确认。
B 发出确认,确认号 ack = u +1,而这个报文段自己的序号 seq = v。
TCP 服务器进程通知高层应用进程。
从 A 到 B 这个方向的连接就释放了,TCP 连接处于半关闭状态。B 若发送数据,A 仍要接收。
若 B 已经没有要向 A 发送的数据, 其应用进程就通知 TCP 释放连接。

面试题:Tomcat 、Nginx 、Apache的区别?各自的优点是什么?

原创2019-05-28 18:27·老王谈运维

Tomcat 、Nginx 、Apache 的区别? 各自的优点是什么? 什么场景下用合适?

Apache

Apache HTTP服务器是一个模块化的服务器,可以运行在几乎所有广泛使用的计算机平台上。其属于应用服务器。Apache支持支持模块多,性能稳定,Apache本身是静态解析,适合静态HTML、图片等,但可以通过扩展脚本、模块等支持动态页面等。

Apache相对于Tomcat的优点:

服务器来说处理静态文件是它的优势,速度快。Apache是静态解析,适合静态HTML、图片等。

Apache 相对于 Nginx 的优点:

apache的 rewrite 比nginx 的强大;支持动态页面;支持的模块多,基本涵盖所有应用;性能稳定。

缺点:配置相对复杂,自身不支持动态页面。

Tomcat:

Tomcat是应用(Java)服务器,它只是一个Servlet(JSP也翻译成Servlet)容器,可以认为是Apache的扩展,但是可以独立于Apache运行。

缺点:可以说Tomcat 只能用做java服务器

优点:动态解析容器,处理动态请求,是编译JSP/Servlet的容器。

Nginx

Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”,是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器。

nginx相对于apache的优点:

轻量级,同样起web服务,比apache占用更少的内存及资源;抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能;高度模块化的设计,编写模块相对简单;提供负载均衡

缺点Nginx 只适合静态和反向代理。

应用场景:

  • 反向代理
  • 负载均衡
  • HTTP服务器(包含动静分离)
  • 正向代理

三者之间的区别:

1)Nginx和tomcat的区别

nginx常用做静态内容服务和代理服务器,直接外来请求转发给后面的应用服务器(tomcat,Django等),tomcat更多用来做一个应用容器,让java web app泡在里面的东西。

注意:nginx只是把请求做了分发,不做处理!!!

2)nginx和Apache的区别

Apache是同步多进程模型,一个连接对应一个进程,而nginx是异步的,多个连接(万级别)可以对应一个进程。

Nginx轻量级,抗并发,处理静态文件好Apache超稳定,对PHP支持比较检单,nginx需要配合其他后端用,处理动态请求有优势,建议使用前端nginx抗并发,后端apache集群,配合起来。

应用场景分析:

Tomcat结合Apache、Nginx实现高性能的web服务器

Tomcat虽然是一个servlet和jsp容器,但是它也是一个轻量级的web服务器。它既可以处理动态内容,也可以处理静态内容。但是,tomcat的最大优势在于处理动态请求,处理静态内容的能力不如apache和nginx,我们可以利用nginx的高并发,低消耗的特点与tomcat一起使用。

通常情况下,tomcat与nginx、Apache结合使用,nginx、apache既可以提供web服务,也可以转发动态请求至tomcat服务器上。通常nginx、apache只提供代理的功能,也就是转发请求至tomcat服务器上,而对于静态内容的响应,则由前端负载均衡器来转发至专门的静态服务器上进行处理。其架构类似于如下图:

相关推荐

0722-6.2.0-如何在RedHat7.2使用rpm安装CDH(无CM)

文档编写目的在前面的文档中,介绍了在有CM和无CM两种情况下使用rpm方式安装CDH5.10.0,本文档将介绍如何在无CM的情况下使用rpm方式安装CDH6.2.0,与之前安装C5进行对比。环境介绍:...

ARM64 平台基于 openEuler + iSula 环境部署 Kubernetes

为什么要在arm64平台上部署Kubernetes,而且还是鲲鹏920的架构。说来话长。。。此处省略5000字。介绍下系统信息;o架构:鲲鹏920(Kunpeng920)oOS:ope...

生产环境starrocks 3.1存算一体集群部署

集群规划FE:节点主要负责元数据管理、客户端连接管理、查询计划和查询调度。>3节点。BE:节点负责数据存储和SQL执行。>3节点。CN:无存储功能能的BE。环境准备CPU检查JDK...

在CentOS上添加swap虚拟内存并设置优先级

现如今很多云服务器都会自己配置好虚拟内存,当然也有很多没有配置虚拟内存的,虚拟内存可以让我们的低配服务器使用更多的内存,可以减少很多硬件成本,比如我们运行很多服务的时候,内存常常会满,当配置了虚拟内存...

国产深度(deepin)操作系统优化指南

1.升级内核随着deepin版本的更新,会自动升级系统内核,但是我们依旧可以通过命令行手动升级内核,以获取更好的性能和更多的硬件支持。具体操作:-添加PPAs使用以下命令添加PPAs:```...

postgresql-15.4 多节点主从(读写分离)

1、下载软件[root@TX-CN-PostgreSQL01-252software]#wgethttps://ftp.postgresql.org/pub/source/v15.4/postg...

Docker 容器 Java 服务内存与 GC 优化实施方案

一、设置Docker容器内存限制(生产环境建议)1.查看宿主机可用内存bashfree-h#示例输出(假设宿主机剩余16GB可用内存)#Mem:64G...

虚拟内存设置、解决linux内存不够问题

虚拟内存设置(解决linux内存不够情况)背景介绍  Memory指机器物理内存,读写速度低于CPU一个量级,但是高于磁盘不止一个量级。所以,程序和数据如果在内存的话,会有非常快的读写速度。但是,内存...

Elasticsearch性能调优(5):服务器配置选择

在选择elasticsearch服务器时,要尽可能地选择与当前业务量相匹配的服务器。如果服务器配置太低,则意味着需要更多的节点来满足需求,一个集群的节点太多时会增加集群管理的成本。如果服务器配置太高,...

Es如何落地

一、配置准备节点类型CPU内存硬盘网络机器数操作系统data节点16C64G2000G本地SSD所有es同一可用区3(ecs)Centos7master节点2C8G200G云SSD所有es同一可用区...

针对Linux内存管理知识学习总结

现在的服务器大部分都是运行在Linux上面的,所以,作为一个程序员有必要简单地了解一下系统是如何运行的。对于内存部分需要知道:地址映射内存管理的方式缺页异常先来看一些基本的知识,在进程看来,内存分为内...

MySQL进阶之性能优化

概述MySQL的性能优化,包括了服务器硬件优化、操作系统的优化、MySQL数据库配置优化、数据库表设计的优化、SQL语句优化等5个方面的优化。在进行优化之前,需要先掌握性能分析的思路和方法,找出问题,...

Linux Cgroups(Control Groups)原理

LinuxCgroups(ControlGroups)是内核提供的资源分配、限制和监控机制,通过层级化进程分组实现资源的精细化控制。以下从核心原理、操作示例和版本演进三方面详细分析:一、核心原理与...

linux 常用性能优化参数及理解

1.优化内核相关参数配置文件/etc/sysctl.conf配置方法直接将参数添加进文件每条一行.sysctl-a可以查看默认配置sysctl-p执行并检测是否有错误例如设置错了参数:[roo...

如何在 Linux 中使用 Sysctl 命令?

sysctl是一个用于配置和查询Linux内核参数的命令行工具。它通过与/proc/sys虚拟文件系统交互,允许用户在运行时动态修改内核参数。这些参数控制着系统的各种行为,包括网络设置、文件...

取消回复欢迎 发表评论: