TCP与UDP简介
TCP协议和UDP协议都是传输层协议。
TCP(Transmission Control Protocol,传输控制协议)提供的是面向连接,可靠的字节流服务。即客户和服务器交换数据前,必须现在双方之间建立一个TCP连接,之后才能传输数据。并且提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
UDP(User Data Protocol,用户数据报协议)是一个简单的面向数据报的运输层协议。它不提供可靠性,只是把应用程序传给IP层的数据报发送出去,但是不能保证它们能到达目的地。由于UDP在传输数据报前不用再客户和服务器之间建立一个连接,且没有超时重发等机制,所以传输速度很快。
TCP与UDP区别——报头不同
TCP
![d33bccbd6582856730e129833088f2e5.png](https://i-blog.csdnimg.cn/blog_migrate/de4243430be0f0db2a0935e06094b6cb.png)
源/目的端口号: 表示数据是从哪个进程来, 到哪个进程去;
32位序号/32位确认号: 不一定从0开始(作用:保证确认应答;保证数据按序到达;去重)
4位TCP报头长度: 表示该TCP头部有多少个32位bit(有多少个4字节); 所以TCP报头最大长度是15 * 4 = 60 字节
6位标志位:
1. URG: 紧急指针是否有效
2. ACK: 确认号是否有效
3. PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走
4. RST: 对方要求重新建立连接; 我们把携带RST标识的称为复位报文段
5. SYN: 请求建立连接; 我们把携带SYN标识的称为同步报文段
6. FIN: 通知对方, 本端要关闭了, 我们称携带FIN标识的为结束报文段
16位窗口大小: 接收缓冲区剩余的空间大小
16位校验和: 发送端填充, CRC校验. 接收端校验不通过, 则认为数据有问题. 此处的检验和不光包含TCP 首部, 也包含TCP数据部分.
16位紧急指针: 标识哪部分数据是紧急数据;
UDP
![d33fc2be81b78969286b97183abb0017.png](https://i-blog.csdnimg.cn/blog_migrate/5c5cd6139f118344b869aec5ea1b30af.png)
16位UDP长度,表示整个数据报(UDP首部+UDP数据)的最大长度;
如果校验出错,就会直接丢弃。
UDP数据报最大长度64K(包含UDP首部),如果数据长度超过64K就需要在应用层手动分包,UDP无法保证包序,需要在应用层进行编号。
TCP与UDP区别——特点不同
TCP
1、面向连接
TCP三次握手过程
(1)主机A通过向主机B 发送一个含有同步序列号标志位的数据段(SYN)给主机B ,向主机B 请求建立连接,通过这个数据段,主机A告诉主机B 两件事:我想要和你通信;你可以用哪个序列号作为起始数据段来回应我。
(2)主机B 收到主机A的请求后,用一个带有确认应答(ACK)和同步序列号(SYN)标志位的数据段响应主机A,也告诉主机A两件事:我已经收到你的请求了,你可以传输数据了;你要用哪个序列号作为起始数据段来回应我。
(3)主机A收到这个数据段后,再发送一个确认应答,确认已收到主机B 的数据段:“我已收到回复,我现在要开始传输实际数据了”。
这样3次握手就完成了,主机A和主机B 就可以传输数据了。
TCP四次挥手过程
(1)当主机A完成数据传输后,将控制位FIN置1,提出停止TCP连接的请求。
(2)主机B收到FIN后对其作出响应,确认这一方向上的TCP连接将关闭,将ACK置1。
(3)由B 端再提出反方向的关闭请求,将FIN置1。
(4)主机A对主机B的请求进行确认,将ACK置1,双方向的关闭结束。
![8b37c9e3ac303035d343d51bb0f40d7f.png](https://i-blog.csdnimg.cn/blog_migrate/16598508c1a3293a2442cf395ebe2d27.png)
TIME_WAIT状态
TCP协议规定,主动关闭连接的一方要处于TIME_ WAIT状态,等待两个MSL(最大报文生存周期)的时间后才能回到CLOSED状态。
TIME_WAIT持续存在2MSL的话,就能保证在两个传输方向上的尚未被接收或迟到的报文段都已经消失(否则服务器立刻重启, 可能会收到来自上一个进程的迟到的数据, 但是这种数据很可能是错误的)。
同时也是在理论上保证最后一个报文可靠到达(假设最后⼀一个ACK丢失, 那么服务器会再重发一个 FIN.。这时虽然客户端的进程不在了, 但是TCP连接还在, 仍然可以重发LAST_ACK)。
2、可靠传输
(1)确认应答机制&序列号
TCP将每个字节的数据都进行了编号,即为序列号。
每一个ACK都带有对应的确认序列号,意思是告诉发送者,我已经收到了哪些数据;;下一次你从哪里开始发。
(2)超时重传&序列号
主机A发送数据给B之后, 可能因为网络拥堵等原因, 数据无法到达主机B; 如果主机A在一个特定时间间隔内没有收到B发来的确认应答, 就会进行重发;
主机A未收到B发来的确认应答,也可能是因为ACK丢失了,因此主机B会收到很多重复数据.。那么TCP协议需要能够识别出那些包是重复的包,,并且把重复的丢弃掉.,这时候我们可以利用序列号, 就可以很容易做到去重的效果。
(3)拥塞控制
每次发送数据包的时候, 将拥塞窗口和接收端主机反馈的窗口大小做比较, 取较小的值作为实际发送的窗口。
拥塞控制, 归根结底是TCP协议想尽可能快的把数据传输给对方, 但是又要避免给网络造成太大压力的折中方案。
3、面向字节流
创建一个TCP的socket, 同时在内核中创建一个发送缓冲区和一个接收缓冲区;
另一方面, TCP的一个连接, 既有发送缓冲区, 也有接收缓冲区, 那么对于这一个连接, 既可以读数据, 也可以写数据. 这个概念叫做 全双工。
(1)调用write时, 数据会先写入发送缓冲区中;
(2)如果发送的字节数太长, 会被拆分成多个TCP的数据包发出; 如果发送的字节数太短, 就会先在缓冲区里等待, 等到缓冲区长度差不多了, 或者其他合适的时机发送出去;
(3)接收数据的时候, 数据也是从网卡驱动程序到达内核的接收缓冲区;
(4)然后应用程序可以调用read从接收缓冲区拿数据;
UDP
1.无连接:知道对端的IP和端口号就直接进行传输, 不需要建立连接。
2.不可靠:没有确认机制, 没有重传机制; 如果因为网络故障该段无法发到对方, UDP协议层也不会给应用层返回任何错误信息。
3.面向数据报:不能够灵活的控制读写数据的次数和数量,应用层交给UDP多长的报文, UDP原样发送, 既不会拆分, 也不会合并。
4.数据收不够灵活,但是能够明确区分两个数据包,避免粘包问题。
总 结
最后,对TCP和UDP之间的区别做一个总结:
1.TCP面向连接,即客户端需要通过三次握手才能和服务端建立起连接,在这个连接的基础上才可以进行数据传输;而UDP是无连接的,发送数据之前不需要建立连接。因此,TCP需要在端系统中维护连接状态,而UDP则不需要维护连接状态;
2.TCP提供可靠的服务,即通过TCP连接传输的数据能确保无差错、不丢失、无重复且按序到达;UDP不提供可靠的传输服务,传输过程有可能出现丢包,同时也不保证数据报的到达顺序;
3.TCP面向字节流,实际上TCP把数据看作是一连串无结构的字节流;UDP则是面向报文传输;
4.TCP有拥塞控制机制,当源主机和目的主机间的一条或者多条链路变得极度拥塞时来遏制运输层TCP发送方,而UDP没有拥塞控制机制,相比之下,在出现拥塞的情况下,UDP不会降低源主机发送数据的速率,更适合用于支撑部分实时应用如IP电话、实时视频会议等;
5.TCP连接是点对点的,而UDP支持一对一、一对多、多对一和多对多的交互通信;
6.从报文段结构上考虑,每个TCP报文段都有20字节的首部开销,而UDP仅有8字节的开销。
欢迎关注我们~
计算机网络翻转课堂
![5d2981e335d9b4b3131482d122defd88.png](https://i-blog.csdnimg.cn/blog_migrate/0565b47c7ded27fc6cbc89280a7f7fa5.png)