TCP/UDP协议

TCP与UDP是干什么的?

        我们常用的网络通讯,比如浏览网页,软件聊天,以及你现在正在看的文章,都是通过这两种协议进行数据传输的。

那么它们到底如何工作的,它们之间又有什么区别呢?看完这篇文章,你一定有所收获

通过例字了解TCP的三握四挥

        TCP/UDP协议都工作在传输层,他们的目标都是在程序之间传输数据。数据可以是图片、文本文件,可以是视频,对于TCP/UDP协议来说,都是一堆二进制数,并没多大的区别。 那么TCP/UDP之间的区别到底是什么呢?:一个基于连接,一个基于非连接

TCP:基于连接的协议

UDP:基于非连接的协议

        让我来举一个例子说明一下什么是连接,什么又是非连接:“我们人之间的通信,分为(写信)和(打电话),如果不考虑它们的传输速度,那么它们之间的区别显而易见:写信会出现你把信件寄出去对方是否能收到;收到时的内容是否还是完整的;如果写了好几封信收到的顺序是否是正确的?这些都是一个未知数,甚至是你填写的收信地址和收信人是否存在都无法确认,其实这些都是问题。”“那么如果是打电话的话就有所不同了,从你打电话到对方接通,到互相通话,直到结束挂断电话;这一系列的流程都能得到及时的反馈,并且能确定对方能准确的接收到。

        打电话是基于连接的,也就是我刚刚在上面说的TCP协议;写信是非连接的,也就相当于UDP协议。

TCP的三次握手

        知道了TCP/UDP是干什么的了,那么我们来聊聊:TCP是如何保证以上过程的?

分别为:三次握手、传输确认、四次挥手。

        (1)三次握手:三次握手是建立连接的过程,当客户端向服务端发起连接时,会先发一包数据询问一下,我是否可以与你建立连接,这份数据称为“SYN”包;如果对端同意连接,则会回复一包SYN+ACK包;客户端收到后会再次发给服务端一份ACK包,然后才成功建立连接。因为这个建立连接的过程一共发送了三个数据包,所以称为“三次握手”。不知道看到这里有么有一个疑问,为什么一定要三次握手,而不是两次握手:直接客户端发送SYN到给服务端,服务端收到以后回复SYN+ACK包,直接就连接岂不是更快(就像你对一个女孩子说:可以牵手吗?她说可以,直接就牵手呗)。

        然而计算机互联与现实不同,“三次握手”是为了防止因为已失效的请求报文,突然又传到服务器引起错误。

        这是什么意思?假设以两次握手就可以建立连接解释一下:假设客户端发送了一个SYN包给服务端来请求建立连接,这个SYN1包因为某些未知的原因并没有到达服务器,在中间某个网络节点产生了滞留,为了建立连接客户端会重写发送SYN包,这个SYN包2正常送达了服务端,服务端回复SYN+ACK之后就立刻建立了连接,但是在这时第一包阻塞的网络节点突然恢复,那么第一次发送的SYN包1也会被发送到服务端,服务端收到之后,是辨别不出是第一次被阻塞的SYN包,它会认为这时客户端想要再次建立一个新的连接,但是客户端也不知道第一次发送后被阻塞的SYN包1竟然又疏通后送达了服务端。这时两个端就发生了误会,客户端还是认为是建立的一个连接,但是服务端会认为客户端想要建立两个连接,这就会造成状态不一致,这可能会导致信息崩溃。

        那么看了上面的解释,就理解了为什么要“三次握手”。(客户端可以自己决定是不是要发送最后的ACK包)服务端收不到最后的ACK包,自然是不会认为连接建立成功。所以“三次握手”就是为了解决网络信道不可靠的问题,是为了在不可靠的信道上建立可靠的连接。

TCP的数据传输

        (2)建立连接:经过了“三次握手之后”,客户端和服务端都进入了数据传输状态,刚刚说过TCP协议是为了在不可靠的信道上保证可靠的连接。那么现在又出现了新的问题:如何解决丢包问题;如何解决乱序问题。

        发送端想要发送数据,TCP其实为为一个连接提供了一个缓冲区,这个缓冲区是由从第一个连接的序列号为0,后面每个字节的序列号都会以此增加1,就是0~N。在发送数据时从发送缓冲区取一部分数据组成发送报文,在其TCP协议头中会附加序列号和长度;接收端收到后需要回复确认报文,确认报文中的ACK=接收序列号+长度,也就是下一包数据需要发送的起始序列号。这样一问一答的方式能够使发送端确认发送的数据已经被对方收到,发送端也可以一次性发送连续的多包数据,接收端只需要回复一次ACK就可以了,这样发送端可以把待发送的数据分割成一系列的碎段,然后发送到对端,对端根据序列号和长度,在接收后重构出来完整的数据。假设在发送的途中丢失了一些数据包,则接收端可以要求发送端重传,比如发了0~199但是丢失了100~199,接收端向发送端发送ACK=20的报文,要求从100开始重新传,发送端收到后重传这一包数据,接收端收到后进行序列号排序进行补齐。注意------>>(以上部分不区分客户端和服务端,因为TCP协议是双工的,只在意发送端和接收端即可)

        其实这个原理我个人认为还是挺难理解的,如果没有老师问,靠自己悟,感觉还是有一点点难度,举个例子👇

        让我来举一个例子说明一下:比如你是一个国家的国王,假设为猫国,那么如果你想发送一封求和的协议到鼠国,但是呢,又怕中间有人作祟,拍数据丢失或错误,要不然就又要引起战争了。那么你想起了之前和鼠国到的国王私下见了一个面,各自带了几个最信任的随从,随从们规定了每次要发送的报文通牒,规定并交互了通信的专门语言和发送形式。那么假设停战协议是”0 1 2 3 4 5 6,停战吧,喵”(当然这里的文字在计算机中一律理解为二进制数),那么你们规定:不同重要的信息用不同的盒子装,一般的用木盒子、紧急点的用镶金边的,更紧急的连盒子都要是金的(这里的不同的盒子代表了不同的序列号),在盒子上要雕刻上数字,代表盒子里面的信息由几个字(计算机中是字节长度),比如说上面的信号是10个字,我用想要用的盒子来装,我一次性就发十个字,分两个盒子发,在第一个盒子上雕刻上4,在第二个上刻上6 。因为交通不便和战争原因,第二个盒子在运输途中被毁了,送到鼠国的只有第一个盒子,装着“0 1 2 3”,那么鼠国的国王一看长度是4,知道了差了信息;就可以给猫国发送信息用相应的盒子发送一个“4”,就一个4就可以了,猫国就知道从“4”断了,就可以补发,鼠国收到后可以让相关人员组成相对应的暗号。那么我还可以分几次去发,还可以一次发几个,总之,丢失的肯定能得到回复,并且可以补发,有相关人员的暗号也是不会顺序错乱的。

        计算机中的TCP协议远远没有上面说的那么简单,这里只说了简单的原理部分,虽然对于初学者也不见得多么简单,反正是对我初学时很是不友好,晦涩难以理解。其中还有很多很深的知识,往更深处还有,确认号 (Acknowledgment Number) ,标志位 (Flags) ,窗口大小 (Window Size) 用来流量控制,校验和 (Checksum) 。等等,需要自己不断学习查找理解才能掌握。

TCP的四次挥手

        如果客户端和服务端之间想要关闭连接,那么就需要四次挥手的操作过程。为什么要四次挥手,和三次挥手一样,防止丢包,并且双方确认,安全度更高。

        想要关闭连接的时候,客户端和服务端双方都可以发起关闭连接的请求。假设客户端想要关闭这个连接,那么客户端会向服务端发送一份FIN包,然后客户端自己进入终止等待1的状态,这是第一次挥手;服务端收到FIN包后,发送确认后的ACK包给回客户端,然后自己进入了关闭等待状态,客户端收到ACK包后进入终止等待2的状态,这是第二次挥手;此时服务端还可以发送未发送的文件包,客户端也一样还可以接收文件包,当服务端发送完要发送的数据时,会发送一个FIN包,进入最后确认状态,这是第三次挥手;客户端接收到FIN包后,会回复一个ACK包,进入超时等待状态,经过超时时间后关闭,而服务端收到ACK包后立即关闭,这是第四次挥手。

        为什么客户端要等待超时时间,因为当最后一次客户端向服务端发送ACK包的时候,如果ACK包在网络路径中丢失,那么客户端还能发这个ACK包,如果发送ACK包后,没有超时等待这个状态而是立即关闭,那么如果这个ACK包在网络路径中丢失,那么服务端会一直停留在关闭确认状态,导致无法彻底关闭连接。

        👇看下面的图也行,不想看上面的大段文字,直接看例子也行,这个地方挺好理解的。

举个简单的例子:客户端对服务端说:我要撤了

服务端回复:好

(这个阶段还能嘱咐一两句话)

然后服务端也对客户端说:我也要撤了

客户端回复:好的。

然后它俩就都撤了,这个连接也就关闭了。

这个机制和三次握手一样,也是为了在不可靠的网络链路中建立可靠的连接断开确认。

UDP协议

        首先我们要知道UDP协议是基于非连接的,发送数据就是将数据包封装一下,然后直接从网卡发出去就可以了。数据包之间并没有状态上的连接,正是因为UDP这种简单的处理方式导致它的性能损耗非常少,而且快,十分快;性能损耗少,资源占用少;但是对于网络传输过程中产生的丢包却是无法解决的。所以UDP在传输稳定上是弱于TCP。

        所以我们可以总结出TCP与UDP的特点

        TCP:传输稳定可靠,适用于对网络通讯质量要求较高的场景,需要将数据准确无误的传达给对方的情况。比如:发送邮件、传输文件、浏览网页等。

        DUP:速度快,但是容易产生丢包。所以适用于对实时性要求较高,但是对少量丢包并没有太大要求的场景。比如:比如域名查询,视频通话,视频直播等。

隧道网络(VPN)

        UDP还有一个非常重要的使用场景,那就是隧道网络,我们都知道的:VPN。应该都听说过,不过超级好孩子也有没听说过的。这就是我们在下一篇文章中要详细说的了。

        如果你看到了这里,十分感谢,希望我的文章可以帮助到你理解TCP和UDP,内容过于基础,主要面向初出茅庐的大学生,希望可以让你们通过例子更加具象的理解十分抽象的概念。因为大学课本上书上的一些计算机网络的知识讲起来真的晦涩、难懂,而且......反正本人刚刚上大学时,被折磨不轻,太痛苦了,就想着自己学会了,写一些文章,总结一下,可以稍微减少一下理解难度。

        总之,如果感兴趣的话可以持续关注本人文章,相信你看完后一定能对计算机网络的整体框架有具体的认识,剩下的就是自己不断积累,往树干和树枝上长叶子了,虽然学习的过程很痛苦,理解知识点很想哭o(╥﹏╥)o,但是只要坚持不懈,总有长成参天大树的那一天,加油,我相信你。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值