在了解TCP和UDP之前,我们需要知道什么是IP什么是端口
IP :相当于电脑的身份证,是唯一的
ip地址的类别:
端口: 相当于电脑上运行中的程序,需要使用端口来标记(端口号不是随意使用的,而是按照一定的规定进行分配)
知名端口:
知名端口是众所周知的端口号,范围从0到1023 21端口分配给FTP服务
22端口分配给SSH服务
80端口分配给HTTP服务
动态端口:
动态端口的范围是从1024到65535,所谓动态动态端口,就是因为它一般不固定分配某种服务,而是动态分配
UPD:
UDP协议全称是用户数据报协议
特点:
1.面向无连接
不需要三次握手,想发数据就发,就像搬运工一样,不会对数据报进行任何拆分与拼接操作。
具体来说就是:
- 在发送端,应用层将数据传递给传输层的UDP协议,UDP只会给数据增加一个UDP头标识下是UDP协议,然后就传递给网络层了
- 在接收端,网络层将数据传递给传输层,UDP只去除IP报文头就传递给应用层,不会任何操作
2.有单播,多播,广播的功能
UDP不止支持一对一的传输方式,同样支持一对多,多对多,多对一的方式,也就是说UDP提供了单播,多播,广播的功能。
3.UDP是面向报文的
发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。UDP对应层交下来的报文,既不合并也不拆分,而是保留这些报文的边界。因此,应用程序必须选择合适大小的报文
4.不可靠性
首先不可靠性体现在无连接上通信都不需要建立连接,想发就发,当网络环境不好由于没有拥塞控制及可能会出现丢包的情况,所以说不可靠。
并且收到什么数据就传递什么数据,并且也不会备份数据,还没有应答机制,不会确定对方是否已经正确收到数据。
5.传输数据报文时很高效
高效的原因其实就是头部开销小。
UDP头部包括了以下几个数据:
- 两个十六位的端口号,分别为源开口和目标端口
- 整个数据报文的长度
- 整个数据报文的检验,该字段用于字段用于发现头部信息和数据中的错误
因此UDP的头部开销小,只有八字节,相比TCP的至少二十字节少的多,在传输数据报时很是高效!
TCP:
TCP协议全称是传输控制协议
特点:
- 面向连接
面向连接,是指发送数据之前必须在两端建立连接。建立连接的方法是“三次握手”,这样能建立可靠的连接,是为数据的可靠打下了基础。 - 仅支持单播传播
每条TCP传输连接只能有两个端点,只能进行点对点的数据传输,不支持多播和广播传输方式。 - 面向字节流
TCP不像UDP一样那样一个个报文独立的传输,而是在不保留报文边界得情况下以字节流方式进行传输 - 仅支持单播传输
每条TCP传输连接只能有两个端点,只能进行点对点得数据传输,不支持多播和广播传输方式。 - 面向字节流
TCP不像UDP那样一个个报文独立得传输,而是在不保留保温边界得情况下以字节流方式进行传输 - 可靠性传输
由于TCP拥有应答机制,如果接收方如果没收到数据和,TCP会判断是否丢包如果丢包得话会进行重传 - 拥有拥塞控制
当网络出现拥塞得时候,TCP能够减小向网络注入数据的速率和数量,缓解拥塞 - TCP提供全双工通信
TCP允许通信双方的应用程序在任何时候都能发送数据,因为TCP连接的两端都没有缓存用来临时存放双向通信的数据。
TCP和UDP的比较
TCP | UDP |
---|---|
面向连接 | 无连接 |
可靠传输,使用流量控制和拥塞控制 | 不可靠传输,不使用流量控制和拥塞控制 |
只能是一对一通信 | 支持一对一,一对多,多对一和多对多交互通信 |
面向字节流 | 面向报文 |
首部最小20字节,最大60字节(慢但稳) | 首部开销小,仅8字节(快却危) |
TCP的三次握手四次挥手
三次握手示意图
为什么TCP相比UDP来说稳定,其原因就是TCP有着三次握手的机制,为什么会叫做三次握手呢?
其实就是在接收,发送之前,双方需要建立一个虚拟的通道,这个过程称之为3次握手。
三次握手流程:
- 第一次握手:客户端发送syn包(syn=x)的数据包到服务器,并进入发送(SYN_SEND)状态,等待服务器确认。
- 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入接收数据(SYN_RECV)状态(ACK是对接收数据的确认,SYN表示要向客户端发送的数据)。
- 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入正式成立(ESTABLISHED)状态,双方确认后建立通道,三次握手成功。
过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP连接都将被一直保持下去。
四次挥手示意图
有合就有散,那为散的时候是四次握手呢,首先四次握手也称作连接终止协议
由于TCP连接是全双工的,因此每个放向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
- 第一次挥手:主动关闭方发送一个FIN,用来关闭主动发到被动方的数据传送,也就是主动关闭告诉被动方:我已经不会再给你发数据了(当然,在FIN包之前发送出去出去的数据,如果没有收到对应的ack确认报文,主动关闭放依然会重发这些数据),但是,此时主动关闭方还可以接收数据
- 第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号, SYN 和 FIN 都有seq(序列)序号)。
- 第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发送数据了
- 第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,走到这一步也就代表四次挥手成功
如有那里不满还请大佬们键盘留情