Program Life
  • Introduction
  • Catalog
  • Part I - Language
    • 目录
    • Golang
      • go 知识点合辑
      • go mod 简介
      • recover & const 简述
      • 关于 nil 的一些事情
      • slice 底层结构
    • JS
      • js 零基础起步
    • Python
      • python 基础
  • Part II - Network
    • 目录
    • TCP与UDP 对比
    • http2
      • http/2.0 and http/2.0 in Go
    • Grpc
      • gRPC 客户端连接语义与API
      • gRPC over http/2
      • gRPC 的 go 拦截器
  • Part III - Database
    • 目录
    • 常见 DB 基础细节
    • High Performance Mysql, 3th Edition - 笔记
    • mysql 中的索引类型
    • 批量写入造成mysql访问慢问题追踪
  • Part Ⅳ - Devops
    • 目录
    • Docker
      • Docker 基础使用指南
    • Kubernetes
      • K8S网络之网络框架
      • K8S网络之service间通信
      • K8S网络之集群外访问service的方式
    • IPVS 在 k8s 中连接保持引发的问题
    • Linux 常用指令
    • Linux 内存缓慢增长问题
    • Linux 性能领域大师布伦丹·格雷格的工具图谱
  • Part Ⅴ - Bigdata
    • 目录
    • Machine Learn
      • PCA原理推导
  • Part Ⅵ - Algorithm
    • 目录
    • 常用算法列表
    • 分布式一致性协议简介
    • ARC 算法简述
  • Part Ⅶ - Design
    • 目录
  • Part Ⅷ - Skill
    • 目录
    • 关于沟通、交流
    • Google 技能评分卡
    • 架构之重构的12条军规
    • 驾考指南
    • 杂项
    • RNote
      • 代码重构培训(笔记)
      • 登高四书(笔记)
      • 番茄工作法图解(笔记)
Powered by GitBook
On this page
  • TCP协议
  • 三次握手的过程:
  • 四次挥手过程
  • UDP协议
  • TCP与UDP的区别
  • 为什么UDP比TCP快
  • 为什么TCP比UDP可靠
  • 什么时候使用TCP
  • TCP无边界,UDP有边界

Was this helpful?

  1. Part II - Network

TCP与UDP 对比

面向报文的传输方式是应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。

面向字节流的话,虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序看成是一连串的无结构的字节流。TCP有一个缓冲,当应用程序传送的数据块太长,TCP就可以把它划分短一些再传送。如果应用程序一次只发送一个字节,TCP也可以等待积累有足够多的字节后再构成报文段发送出去。

TCP协议

  • Transmission Control Protocol,传输控制协议

  • 面向连接的协议

  • 需要三次握手建立连接

  • 需要四次挥手断开连接

  • TCP报头最小长度:20字节

三次握手的过程:

  1. 客户端发送:SYN = 1, SEQ = X, 端口号

  2. 服务器回复:SYN = 1, ACK = X + 1, SEQ = Y

  3. 客户端发送:ACK = Y + 1, SEQ = X + 1

确认应答信号ACK = 收到的SEQ + 1。 连接建立中,同步信号SYN始终为1。连接建立后,同步信号SYN=0。

四次挥手过程

  1. A向B提出停止连接请求,FIN = 1

  2. B收到,ACK = 1

  3. B向A提出停止连接请求,FIN = 1

  4. A收到,ACK = 1

优点:

  • 可靠,稳定

    • 传递数据前,会有三次握手建立连接

    • 传递数据时,有确认、窗口、重传、拥塞控制

    • 传递数据后,会断开连接节省系统资源

缺点:

  • 传输慢,效率低,占用系统资源高

    • 传递数据前,建立连接需要耗时

    • 传递数据时,确认、重传、拥塞等会消耗大量时间以及CPU和内存等硬件资源

  • 易被攻击

    • 因为有确认机制,三次握手等机制,容易被人利用,实现DOS 、DDOS攻击

如何保证接收的顺序性:

  • TCP协议使用SEQ和ACK机制保证了顺序性

  • TCP的每个报文都是有序号的。确认应答信号ACK=收到的SEQ+1

UDP协议

  • User Data Protocol,用户数据包协议

  • 面向无连接的协议

  • UDP报头只有8字节

简介:

  • 传输数据之前源端和终端不建立连接

  • 在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制

  • 在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段

  • 由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息

  • UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小

  • 吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制

  • UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态表。

  • UDP是面向报文的。

使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。

优点:

  • 传输速率快

    • 传输数据前,不需要像TCP一样建立连接

    • 传输数据时,没有确认、窗口、重传、拥塞控制等机制

  • 较安全

    • 由于没有了TCP的一些机制,被攻击者利用的漏洞就少了

缺点:

  • 不可靠,不稳定

    • 由于没有了TCP的机制,在数据传输时如果网络不好,很可能丢包

用UDP协议通讯时怎样得知目标机是否获得了数据包 仿造TCP的做法,每发一个UDP包,都在里面加一个SEQ序号,接收方收到包后,将SEQ序号回复给发送方。如果发送方在指定时间以内没有收到回应,说明丢包了。

TCP与UDP的区别

TCP

UDP

TCP面向有链接的通信服务

TCP面向无链接的通信服务

TCP提供可靠的通信传输

UDP不可靠,会丢包

TCP保证数据顺序

UDP不保证

TCP数据无边界

UDP有边界

TCP速度慢

UDP速度快

TCP面向字节流

UDP面向报文

TCP一对一

UDP可以一对一,一对多

TCP报头至少20字节

UDP报头8字节

TCP有流量控制,拥塞控制

UDP没有

为什么UDP比TCP快

  1. TCP需要三次握手

  2. TCP有拥塞控制,控制流量等机制

为什么TCP比UDP可靠

  1. TCP是面向有连接的,建立连接之后才发送数据;而UDP则不管对方存不存在都会发送数据。

  2. TCP有确认机制,接收端每收到一个正确包都会回应给发送端。超时或者数据包不完整的话发送端会重传。UDP没有。因此可能丢包。

什么时候使用TCP

当对网络通讯质量有要求的时候:

  • 比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,

  • 比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。

在日常生活中,常见使用TCP协议的应用如下:

  • 浏览器,用的HTTP

  • FlashFXP,用的FTP

  • Outlook,用的POP、SMTP

  • QQ文件传输

什么时候应该使用UDP:

  • 当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用UDP。

  • 比如,日常生活中,常见使用UDP协议的应用如下:

    • QQ语音

    • QQ视频

    • TFTP

TCP无边界,UDP有边界

TCP无边界

  • 客户端分多次发送数据给服务器,若服务器的缓冲区够大,那么服务器端会在客户端发送完之后一次性接收过来,所以是无边界的;

UDP有边界

  • 客户端每发送一次,服务器端就会接收一次,也就是说发送多少次就会接收多少次,因此是有边界的。

Previous目录Nexthttp2

Last updated 5 years ago

Was this helpful?