声明:本文部分内容来自互联网、书籍等渠道,表示感谢;

转载请注明出处:@热风、https://www.cnblogs.com/refeng/p/13996657.html


TCP/UDP详解

1、TCP/UDP比较

1.1:简介

TCP(Transmission Control Protocol,传输控制协议)和UDP(User Datagram Protocol,用户数据报协议)是OSI七层模型——传输层的两个主要协议,均是互联网的正式标准。

1.2:TCP

TCP是一种面向连接的、可靠的、基于字节流的通信协议,是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。

  • 优点:可靠。传递数据之前,通过三次握手来建立连接,在数据传递时,有滑动窗口、拥塞控制、超时重传等机制保证传输的可靠性、正确性,在数据传输完成后,可保持连接状态(长连接)或通过四次挥手来断开连接(短连接)。
  • 缺点:效率较低占用系统资源高易被攻击。TCP在传递数据之前,要先建连接,会消耗时间,在数据传递时,各种机制都会消耗大量的时间,而且要在每台设备上维护所有的传输连接,事实上,每个连接都会占用系统的CPU、内存等硬件资源。而且TCP有确认机制、三次握手机制,这些容易被人利用。

1.3:UDP

UDP是一种无连接的、不可靠的、基于报文的通信协议,为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。

  • 优点:。没有TCP协议的各种机制。
  • 缺点:不可靠不稳定。尽最大努力交付,如果网络质量不好,就很容易丢包。

1.4:TCP/UDP比较

TCP UDP
是否连接 面向连接 无连接
是否可靠 可靠 不可靠
连接对象个数 只能一对一 支持一对一,一对多,多对一和多对多
传输方式 面向字节流 面向报文
首部开销 首部最小20字节,最大60字节 首部开销小,仅8字节
适用场景 适用于要求可靠传输的应用,例如FTP、HTTP、STMP 适用于实时应用,例如即时通信、视频会议、直播等(丢包影响不大、就要快)

2、TCP详解

2.1:概念

  • TCP是一种面向连接的、可靠的传输层协议;
  • TCP协议建立在不可靠的网络层IP协议之上,IP不能提供任何可靠性机制,TCP的可靠性完全由自己实现;
  • TCP采用的最基本的可靠性技术是:
    • 确认与超时重传
    • 滑动窗口机制进行流量控制

2.2:TCP报文格式

2.2.1:各字段含义

  1. 源端口号与目的端口号:各占2个字节。端口是传输层与高层的服务接口。
  2. 序号:占4字节,是本报文段所发送的数据部分第一个字节的序号。在TCP传送的数据流中,每一个字节都有一个序号。例如,在一个报文段中,序号为300,而报文中的数据共100字节。那么在下一个报文段中,其序号就是400。因此TCP是面向数据流(字节流)的。
  3. 确认号:占4字节,是期望收到对方下次发送的数据的第一个字节的序号,也就是期望收到的下一个报文段的首部中的序号。由于序号字段有32bit长,可对4GB(即4千兆字节)的数据进行编号。
  4. 报头长度:占4bit,
  5. 确认比特ACK:只有当ACK=1时确认序号字段才有意义。当ACK=0时,确认序号没有意义。
  6. 同步比特SYN:在连接建立时使用。当SYN=1ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在发回的报文段中使SYN=1ACK=1,表明这是一个连接接受报文段。因此,同步比特SYN为1,就表示这是一个连接请求或连接接受报文,而 ACK比特的值用来区分是哪一种报文。
  7. 终止比特FIN:用来释放一个连接,当FIN=1时.表明欲发送的字节串已经发完,并要求释放传输连接。
  8. 窗口大小:占2字节。窗口字段实际上是报文段发送方的接收窗口,单位为字节。通过此窗口告诉对方,“在未收到我的确认时,你能发送的数据的字节数至多是此窗口的大小。”
  9. 检验和:占2字节。检验和字段检验的范围包括首部和数据这两部分。

2.3:可靠传输步骤

  1. 建立连接
  2. 报文传输
    • 差错控制:校验,错误(丢包)重传机制
    • 流量控制:滑动窗口机制
  3. 关闭连接

2.3.1:建立连接,三次握手

  1. 主机1 首先发起TCP 连接请求,并在所发送的数据段中将控制字段中的SYN置为“1”、ACK置为“0”,并设置数据起始序号为x
  2. 主机2 收到该报文,若同意建立连接,则发送一个连接接受的应答数据段,其中控制字段的SYN 和ACK均被置“1”,指示对第一个SYN 报文段的确认,响应序号x+1,表示对指定报文的响应,同时指定自己的数据序号y,以继续握手操作;否则,主机2 要发送一个将RST置为“1”的应答数据段,表示拒绝建立连接。
  3. 主机1 收到主机2 发来的同意建立连接数据段后,还有再次进行选择的机会,若其确认要建立这个连接,则向主机2 发送确认数据段,确认序号为y+1,同时自己的数据需要为x+1,用来通知主机2 双方已完成建立连接;若主机1已不想建立这个连接,则可以发送一个将RST置为“1”的应答数据段来告之主机2 拒绝建立连接。(思考:若主机1迟迟不发消息,怎么办?)

2.3.2:差错控制

TCP采用校验、确认以及超时重传,进行差错控制。

2.3.2.1:校验与确认

发送方会对发送数据进行处理生成校验码,并设置在校验码字段中,随数据一起发送:

  • 接收方对数据进行校验,判断数据传输是否出现错误;
  • 接收方对正确接收到的数据进行确认;
  • 发送方发送数据时,启动定时器,超时未接收到确认,则重传数据。
2.3.2.2:超时重传

采用单一定时器

  • 发送TCP分段(TCP会自己分段)时,如果没有重传定时器开启,那么开启;如果已有重传定时器开启,不再开启。

  • 收到一个非重复ACK时,如果有数据在传输中,重新开启重传定时器;如果没有数据在传输中,则关闭重传定时器。

  • 未收到确认造成定时器超时,重传所有发出未确认的分段。

  • 收到重复ACK时,超过3个,则立即重传重复确认的数据。

    (还有一些深入知识不详解)

2.3.2.3:流量控制

接收方和发送方都有一定大小的接收和发送缓冲区。发送方的发送速度不能超过接收方的接收速度。

为了防止由于发送端与接收端之间的不匹配而引起数据丢失,TCP采用滑动窗口进行流量控制。双方通过窗口大小来告诉对方,在没有收到确认前,最多可以发送的数据量。

发送窗口=min{拥塞窗口,通告窗口}

  • 拥塞窗口:从通信子网拥塞程度考虑确定的在没有收到接收方确认情况,发送方可以发送的数据量;
  • 通告窗口:从接收方接收能力的角度考虑,确定的在没有收到接收方确认情况,发送方可以发送的数据量;由接收到的TCP报文中的窗口大小字段确定。

2.3.3:关闭连接,四次挥手

  1. 当主机1 的数据已发送完毕时,其在等待确认的同时可发送一个将控制字段FIN 置“1”的数据段给主机2,表示请求中断主机1到主机2的连接。
  2. 若主机2 已正确接收主机1 的所有分段,则会发送一个数据段正确接收的确认段,同时通知本地相应的应用程序,对方要求关闭连接,接着再发送一个对主机1 所发送的FIN段进行确认的应答段。由此便拆除了一个方向的TCP连接。
  3. 但是,此时在相反方向上,主机2 仍然可以向主机1 发送数据,直到主机2 数据发送完毕并要求关闭连接。这个方向上连接的拆除同样要经过(1)、(2)两步,由主机2发起FIN段,主机1应答确认ACK,拆除另一方向的TCP连接。(全双工)

2.4:常用TCP端口号分配

端口号 服务进程 说明
20 FTP 文件传输协议(数据连接)
21 FTP 文件传输协议(控制连接)
23 Telent 虚拟终端网络
25 SMTP 简单邮件传输协议
53 DNS 域名服务器
80 HTTP 超文本传输协议
111 RPC 远程过程调用

2.5:TCP的拥塞控制

2.5.1:概念

网络中的链路带宽、交换节点的存储和处理能力等都是网络的资源,这些资源一般是有限的,当网络的资源容量和处理能力大于网络负载的需求时,网络处于正常运转状态,反之网络会出现拥塞。

网络拥塞的根本原因在于端系统向网络提供的负载大于网络资源容量和处理能力,主要体现在网络转发设备的存储空间有限,网络链路带宽有限以及网络转发设备的处理能力有限等。

TCP拥塞控制的基本策略是发送端通过跟踪传输数据的丢失现象往返时延的变化确定网络的传输能力,并以此来调整发送数据率。

2.5.2:拥塞窗口

拥塞窗口cwnd是每个TCP端系统在建立连接时创建的拥塞控制量,同样定义为发送端未收到确认时可以连续发送的字节数。拥塞窗口随网络传输能力变化而变化。当网络负载较小时,拥塞窗口可以设置比较大,发之,就要设置成相对较小值。

2.5.3:控制方法

TCP发送端可以通过两种方式检测到发送的数据在网络中丢失,一种是通过超时定时器,超时未收到对发送数据的正确确认,则判定所发数据丢失,另一种方式是,当发送端连续收到多个对其发送的某个数据分组的重复确认时,说明该分组后继分组在传输中出了问题。对两种不同方式检测到的数据包丢弃,TCP发送端采用不同的方式进行拥塞控制。

针对超时重发检测到的数据丢失,TCP发送端采用慢启动和拥塞避免方法进行拥塞控制;

对通过重复确认发现的数据包丢失,TCP发送端采用快重发和拥塞避免方法进行拥塞控制。

慢启动门限ssthresh是一个动态变化的门限值,用来确定当前是否采用拥塞避免算法,初始值65535。

2.5.3.1:慢启动算法

RTT:传输往返时间

(思考:cwnd以指数形式增长,为什么叫慢启动算法?)

2.5.3.2:拥塞避免算法

cwnd线性增长。

例子:发生超时,进入慢启动;超过门限,进入拥塞避免

2.5.3.3:工作过程

例子:

3、UDP详解

UDP是一种无连接的、不可靠的传输层协议,UDP协议的目的是希望以最小的开销来达到网络环境中的进程通信目的。

3.1:UDP数据报格式

3.2:UDP的基本工作过程

3.3:常用UDP端口号分配

端口号 服务进程 说明
53 Name server 域名服务
67 Bootps 下载引导程序信息的服务器端口
68 Bootpc 下载引导程序信息的客户器端口
69 TFTP 简单文件传输协议
111 RPC 远程过程调用
123 NTP 网络时间协议
161 SNMP 简单网络管理协议

声明:本文部分内容来自互联网、书籍等渠道,表示感谢;

转载请注明出处:@热风、https://www.cnblogs.com/refeng/p/13996657.html

如果有学到东西,请点赞给予鼓励,谢谢。


最新文章

  1. java即时通信小例子
  2. SpringMVC解决乱码
  3. 如何查询postgresql+openstreetmap
  4. CURL使用方法详解
  5. 解析PHP中的file_get_contents获取远程页面乱码的问题【转】
  6. 20160805_笔记本_CentOS6.4x64分区
  7. [King.yue]Ext.Net 正则表达式用法
  8. 用C++实现绘制标尺的方法,使用了递归
  9. symfony2路径问题
  10. javascript 函数 add(1)(2)(3)(4)实现无限极累加 —— 一步一步原理解析
  11. MongoDB数据库索引构建情况分析
  12. Java入门(5)——类和对象还有构造方法
  13. 他学习一年Python找不到工作,大佬都说你别再学Python了!
  14. 如何将两个PDF文件合并到一个页面中
  15. 【纪录】Proxychain4 使用部署以及利用 ss 加速下载操作
  16. 无法将从VSS中的解决方案添加到TFS的源代码管理器中
  17. 只有设置了 name 属性的表单元素才能在提交表单时传递它们的值
  18. 树莓派mariadb 设置密码
  19. 2018年总结&2019年计划
  20. jQuery .on() and .off() 命名空间

热门文章

  1. day28 Pyhton 面向对象 继承
  2. 利用github创建个人网站
  3. 51Nod 最大M子段和系列 V1 V2 V3
  4. linux下php安装php-kafka扩展和php-rdkafka扩展
  5. centos8用firewalld搭建防火墙
  6. 第六章 IP基本原理
  7. Python中while循环初识
  8. Html+Ajax+Webservice 实现文件跨域上传
  9. PyTorch 中 weight decay 的设置
  10. java 封装多态继承