深入浅出TCP与UDP协议

网络协议是每个前端工程师的必修课,TCP/IP协议族是一系列网络协议的总和,而其中两个具有代表性的传输层协议,分别是TCP与UDP,本文将介绍这两者以及他们之间的区别。

一、TCP/IP网络结构模型

计算机与网络设备要相互通信,双方就必须基于相同的方法。比如,如何探测到通信目标、由那一边先发起通信、使用那种语言进行通信、怎样结束通信等规则都需要事先确定。不同的硬件之间的通信,所有的这一切都需要一种规则。而我们就把这种规则称之为协议(protocol)。

TCP/IP 是互联网相关的各类协议族的总称,比如:TCP,UDP,IP,FTP,HTTP,ICMP,SMTP 等都属于 TCP/IP 族内的协议。

网络参考模型

当通过http发起一个请求时,应用层、传输层、网络层和链路层的相关协议依次对该请求进行包装并携带对应的首部,最终在链路层生成以太网数据包,以太网数据包通过物理介质传输给对方主机,对方接收到数据包以后,然后再一层一层采用对应的协议进行拆包,最后把应用层数据交给应用程序处理。

网络通信就好比送快递,商品外面的一层层包裹就是各种协议,协议包含了商品信息、收货地址、收件人、联系方式等,然后还需要配送车、配送站、快递员,商品才能最终到达用户手中。

一般情况下,快递是不能直达的,需要先转发到对应的配送站,然后由配送站再进行派件。

配送车就是物理介质,配送站就是网关, 快递员就是路由器,收货地址就是IP地址,联系方式就是MAC地址。

快递员负责把包裹转发到各个配送站,配送站根据收获地址里的省市区,确认是否需要继续转发到其他配送站,当包裹到达了目标配送站以后,配送站再根据联系方式找到收件人进行派件。

二、UDP

通过上图我们可以知道,链路层定义了主机的身份,也就是MAC地址,而网络层则定义了IP地址,明确了主机所在的网段,有了这两个地址,数据包就可以由一个主机发送到另一个主机,但是,网络的通信一般都是从一个主机的某个应用程序发出,由另一个主机的应用程序接收,而每台主机都会运行很多程序,所以当数据包发送到主机上时,我们不知道应该哪个程序接收数据包。

因此传输层引入了UDP协议来解决这个问题,为了给每个应用程序标识身份,UDP协议定义了端口,同一个主机上的每个应用程序都需要指定唯一的端口号,并且规定网络中传输的数据包必须加上端口信息。 这样,当数据包到达主机以后,就可以根据端口号找到对应的应用程序了。如下图所示:

因此我们可以总结它的几个特点:

1、面向无连接

首先UDP是不需要连接到主机的,想发数据直接就可以发送。

也就是说:

  • 在发送端,应用层将数据传递给传输层的UDP协议,UDP协议只会给数据增加一个UDP头标识。

  • 而在接收端,网络层将数据传递给传输层,UDP只是去除IP报文后就传递给应用层。

2、不可靠性

不可靠性体现在无连接上,由于UDP通信是不需要建立连接的,不管接收方是否接收到数据,所以肯定是不可靠的。

此外,由于UDP没有拥塞控制,会以恒定的速度发送数据,即使网络条件不好的时候,也不会对发送速率进行调整。这样会导致在网络条件不好的情况下容易导致丢包——数据丢失,但是优点也是明显的,在某些对实时性要求高的应用场景下,使用UDP比TCP更好,比如qq电话,微信视频等。

3、头部开销小

UDP数据包由首部和数据两部分组成,首部长度为8个字节,主要包括源端口和目标端口;数据最大为65527个字节,整个数据包的长度最大可达到65535个字节。

UDP 头部包含了以下几个数据:

  • 两个十六位的端口号,分别为源端口(可选字段)和目标端口

  • 整个数据报文的长度

  • 整个数据报文的检验和(IPv4 可选 字段),该字段用于发现头部信息和数据中的错误

因此 UDP 的头部开销小,只有八字节,相比 TCP 的至少二十字节要少得多,在传输数据报文时是很高效的。

但是由于UDP协议比较简单,实现容易,但这恰恰也是它的缺点,没有确认机制,一旦发出,不知道主机是否接收到数据包,这无法满足对数据传输可靠性高的需求,因此诞生了TCP协议。也就是说TCP协议是具有确认机制的UDP协议。

三、TCP

为了使主机之间能够保持畅通的通信,提供可靠的连接服务,TCP采用了三次握手确立连接,和四次挥手断开连接:

在了解TCP如何建立连接和断开连接之前,我们先了解一下TCP的几个标识,即:SYN()、ACK()、FIN()。

三次握手

为了准确无误的传输数据,TCP协议采用了三次握手的策略:

1、客户端采用TCP协议将带有SYN标志的数据包发送给服务器,等待服务器确认。

2、服务器接收到SYN数据包后,必须确认SYN信号,即自己发送的ACK标志,同时也会想客户端发送一个SYN标志。

3、当客户端接收到ACK+SYN包后,会向服务器端发送ACK包,完成三次握手。

此时,客户端和服务器端就建立了连接,开始传送数据。

如图所示:

四次挥手

由于TCP/IP协议是要占用端口号的,而计算机的端口号却是有限的,如果不断开的话,肯定会造成计算机资源的浪费。

1、当客户端的数据传送完毕时,客户端会发送一个带有FIN标志的数据包。使得服务器端明白自己要断开连接了。

2、由于TCP的连接是双向的,所以断开时也应该是双向的;当服务器收到FIN标志的数据包时,会向客户端发送ACK包,并断开客户端到服务器端的连接,不再接收客户端发送的数据,但服务器仍然可以发送数据给客户端。

3、当服务器端发送完数据后,会向客户端发送一个带有FIN标志的数据包,使得客户端明白自己要断开连接了。

4、当客户端收到断开连接请求后,向客户端发送确认应答。然后客户端会进入等待状态,该状态会持续2MSL。如果这段时间内服务器都没有重发请求,就进入CLOSE状态。

如图所示:

TCP协议的特点

  • 面向连接

    面向连接是指,两个主机传送数据之前,必须建立连接,这样保证了数据传送的可靠性。

  • 点对点传输

    每条TCP传输连接只能有两个端点,只能进行点对点的数据传输

  • 可靠传输

    TCP的三次握手和四次挥手保证了数据的可靠传输

  • 拥有拥塞控制

    当网络情况不好的时候,TCP会减小发送数据的速率和数量。保证数据的可靠传输

【面试题】

1、为什么不能使用两次握手连接?

现在把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。

即:客户端未收到确认连接分组,会忽略服务端发来的任何数据分组 而服务端因为发出的分组超时后,会重复发送同样的分组,这就形成了死锁

2、为什么关闭的时候是四次挥手?

四次挥手不能像三次握手一样,三次握手可以将ACK+SYN 一起发送,ACK用于确认信息,SYN却是用来建立联机的;四次挥手中ACK是不能和FIN一起发送,ACK只是告诉客户端确认我收到了,等我将数据发送完毕之后会向其发送FIN的标志,所以四次挥手是不能够改变的。

四、TCP与UDP的比较

1、对比

  UDP TCP
是否连接 无连接 面向连接
是否可靠 不可靠传输,不使用流量控制和拥塞控制 可靠传输,使用流量控制和拥塞控制
连接对象个数 支持一对一,一对多,多对一和多对多交互通信 只能是一对一通信
传输方式 面向报文 面向字节流
首部开销 首部开销小,仅 8 字节 首部最小 20 字节,最大 60 字节
适用场景 适用于实时应用(IP 电话、视频会议、直播等) 适用于要求可靠传输的应用,例如文件传输

2、总结

  • TCP 向上层提供面向连接的可靠服务 ,UDP 向上层提供无连接不可靠服务。

  • 虽然 UDP 并没有 TCP 传输来的准确,但是也能在很多实时性要求高的地方有所作为

  • 对数据准确性要求高,速度可以相对较慢的,可以选用 TCP


参考文章


深入浅出TCP与UDP协议的更多相关文章

  1. TCP与UDP协议

    传输控制协议(Transmission Control Protocol, TCP)和用户数据报协议(User Datagram Protocol, UDP)是典型的传输层协议. 传输层协议基于网络层 ...

  2. TCP和UDP协议的比较

    通信协议 网络通信是两台计算机上的两个进程之间的通信. 网络通信需要通信协议.网络协议有很多种,就像我们平常交流说话,也有多种语言.. 最常见的协议是TCP/IP协议.UDP协议. TCP:TCP 是 ...

  3. 网络编程协议(TCP和UDP协议,黏包问题)以及socketserver模块

    网络编程协议 1.osi七层模型 应用层  表示层  会话层  传输层  网络层  数据链路层  物理层 2.套接字 socket 有两类,一种基于文件类型,一种基于网络类型 3.Tcp和udp协议 ...

  4. TCP 和 UDP 协议

    TCP 和 UDP 协议 一.socket层 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐 ...

  5. 运输层协议--TCP及UDP协议

    TCP及UDP协议 按照网络的五层分级结构来看,TCP及UDP位于运输层,故TCP及UDP是运输层协议.TCP协议--传输控制协议UDP协议--用户数据报协议 多路复用及多路分解 图多路复用及多路分解 ...

  6. TCP和UDP 协议发送数据包的大小

    在进行UDP编程的时候,我们最容易想到的问题就是,一次发送多少bytes好? 当然,这个没有唯一答案,相对于不同的系统,不同的要求,其得到的答案是不一样的,这里仅对像ICQ一类的发送聊天消息的情况作分 ...

  7. TCP/IP/UDP 协议

    互连网早期的时候,主机间的互连使用的是NCP协议.这种协议本身有很多缺陷,如:不能互连不同的主机,不能互连不同的操作系统,没有纠错功能.为了改善这种缺点,大牛弄出了TCP/IP协议.现在几乎所有的操作 ...

  8. 网络编程协议(TCP和UDP协议,粘包问题)以及socketserver模块

    网络编程协议 1.osi七层模型 应用层  表示层  会话层  传输层  网络层  数据链路层  物理层 2.套接字 socket 有两类,一种基于文件类型,一种基于网络类型 3.Tcp和udp协议 ...

  9. UNP(一):网络编程角度下的TCP、UDP协议

    此博文是学习UNP(UNIX Network Programming)后的读书笔记,供以后自己翻阅回想知识. TCP.UDP概述 在前面<计算机网络与TCP/IP>栏目下已经介绍过一些关于 ...

随机推荐

  1. 浅谈redis

    1.Redis简介: Redis是一个开源的使用ANSI C语言编写,遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.它通常被称为数据结构服务 ...

  2. python+selenium实现163邮箱登陆—iframe动态ID定位 及常用定位方法

    今天发现之前的登录163邮箱脚本定位不到iframe了,原因是iframe拼接了动态ID,修改后的脚本如下: from selenium import webdriver driver = webdr ...

  3. DAX 第六篇:统计函数

    统计函数用于创建聚合,对数据进行统计分析.在使用统计函数时,必须考虑到数据模型,表之间关系,数据重复等因素,一般都会搭配过滤函数实现数据的提取和分析. 统计量一般是:均值.求和.计数.最大值.最小值. ...

  4. AQS初体验

    AQS初体验 AQS是AbstractQueuedSynchronizer的简称.AQS提供了一种实现阻塞锁和一系列依赖FIFO等待队列的同步器的框架.所谓框架,AQS使用了模板方法的设计模式,为我们 ...

  5. python课堂整理4---列表的魔法

    一.list   类, 列表 li = [1, 12, 9, "age", ["大白", "小黑"], "alex"] ...

  6. GoLang fsnotify 实现目录中日志文件大小监控

    需求: 需要监听一个目录中所有文件,当文件大小增加到一定阀值,则将文件清空. 需要引入第三方包:"github.com/howeyc/fsnotify" 代码如下: package ...

  7. IBM RAD中集成Websphere启动后无法debug解决办法

    问题描述: IBM Rational Application Developer for WebSphere软件在启动WebSphere的时候无法以debug模式启动,debug启动后显示为start ...

  8. HTML&CSS兼容性总结

    对目前所遇见的兼容性笔记进行整理分类: 不兼容浏览器 问题概要 问题描述 解决方法 IE6,IE7  3px 并列一行的元素左侧第一个元素没浮动,第二个元素左浮动,则两个元素之间会多3像素空隙 并在一 ...

  9. web设计_3_可伸缩的导航栏

    1. HTML5构建一个选项卡,需要<nav>标签包围一个无序列表,也可以添加role属性告诉辅助设备(如屏幕阅读器)这个元素所扮演的角色. 绝对不要基于图片的导航,对搜索引擎不友好,更新 ...

  10. Could not load NIB in bundle: 'NSBundle.....

    学习NSNotification时遇到了这个问题,错误日志如下: 2015-08-28 17:47:24.617 NSNotificationDemo[7158:786614] *** Termina ...