TCP、UDP的原理及区别

238 阅读5分钟

「这是我参与11月更文挑战的第25天,活动详情查看:2021最后一次更文挑战

今天我们插讲一波网络协议,因为掘金又搞活动了,不得不插讲一波

本文正在参与 “网络协议必知必会”征文活动

什么是网络协议

众所周知互联网厂商有很多,那自然设备也很多,设备之间交流时就需要有一些规范,就像不同国家有不同的语言,当国与国之间交流时,就需要一个翻译,这个翻译就是网络协议,而协议又主要分为七层或者又叫四层,今天我们要讲的TCP、UDP就是在传输层

OSI/RM (七层)TCP/IP (四层)代表协议
应用层应用层HTTP、FTP、TFTP、SMTP、SNMP、DNS
表示层应用层
会话层应用层
传输层传输层TCP、UDP
网络层网络层ICMP、IGMP、IP
数据链路层链路层ARP、RARP
物理层链路层

TCP

主要讲下TCP的三次握手与四次挥手,还有丢包及乱序问题

三次握手

相信很多同学看的最多的例子就是打电话,没错打电话确实很像三次握手

想象一下,你跟黑泽志玲打电话

你:拨打电话 ------> 志玲

你 <----- 志玲: 喂,哪位

你:是我,二狗 ------> 志玲(知道了是二狗准备挂电话)

拨电话,是为了建立跟志玲的连接,但是你并不知道,志玲是否接到了你的电话, 志玲回复你表示,连接已经建立了,但是志玲不知道你是否可以听见她动人的娃娃音,你回复是二狗子,表示志玲我听到你的娃娃音了,我们可以畅通无阻的聊天了 (志玲不想跟二狗聊天准备挂电话)

但是这种比喻只能大概的了解三次握手的意义,并不能很好的解释三次握手

1.png

客户端会先向服务端发送syn包询问是否可以建立连接,如果服务端收到后会回复syn+ack包,客户端收到后会向服务端发送一个ack包表示连接建立,所以称为三次握手

那两次握手行不行,客户端不向服务端发送ack包, 如果只进行两次握手在网络阻塞的时候会出现问题, 当客户端发送了syn1因为某些原因被阻塞了,客户端会重新发一个syn2,这时syn1阻塞恢复发送到了服务端,服务端就会认为,客户端发起了两个网络请求,而客户端只发起了一个,如果是三次握手,服务端收不到客户端发的第二个ack包自然也不会认为客户端发起了两个网络请求,所以两次握手不能保证tcp的稳定性

四次挥手

我们再次举一个不恰当的例子, 好比你跟女朋友打电话(没有女朋友的也可以学习一下), 你跟女朋友说我想挂电话了, 女朋友说我知道了, 这时候你不能挂, 你如果挂电话了, 你可能也'挂'了, 因为她只是知道了你想挂电话, 她可能还有想说的, 直到她说好了可以挂电话了, 这时候你还是不能先挂电话, 你要先说你先挂, 这样她就不会生气, 你要等她真的没有要说的了然后她主动挂电话了, 你才能去打游戏

3.png

客户端会发送fin包告诉服务端要关闭连接,同时进入等待1状态,此为第一次挥手,服务端收到fin包会给客户端发送一个ack包,此为第二次挥手,客户端收到后会进入等待2状态,此时服务端仍可以发送数据,当服务端没有要发送的数据后发送fin包给客户端,此为第三次挥手,客户端收到fin包后发送给服务端一个ack包,并进入等待状态,超时之后断开连接,此为四次挥手

为什么要等待超时才能关闭连接? 为了防止服务端没有收到最后的ack包,此时服务端告诉客户端我没收到时,客户端还可以重新给服务端发送一次ack包并刷新等待时间,直到超时

丢包问题与乱序问题

当一包数据分为几包传输给服务端时就会出现丢包乱序的问题

tcp协议为每一个连接都会建立一个发送缓冲区,从第一个字节开始就有对应的序号,发送报文由序列号、长度及数据内容组成,当服务端收到内容后,就会将序列号加长度组成ack回复给客户端,下次客户端就会根据ack将下一包数据传输过去,当然也可以一次性传输多包数据,服务端收到后进行组装

当数据丢失时,服务端会要求客户端根据序列号进行重发,这样也就保证了tcp的稳定性

2.png

UDP

相比于TCP的打电话,UDP更像是写信,给你喜欢的idol写信,他也不会回复你,信是被妈妈没收了,还是被快递员叔叔搞丢了,还是idol看完了扔进了垃圾桶你也不知道

所以UDP就是直接将数据包传输到服务端,完全不用管服务端是否接收到了数据包,性能损耗也比TCP少很多

TCP与UDP的区别

本质区别,tcp是基于连接的,可以保证信息不丢失,而UDP是基于非连接的,无法保证信息不丢失,但是传输速度较快,tcp稳定性高,udp速度快

结语

有些的不对的地方,希望多多指教,共同学习