程序员社区

聊聊tcp和udp那些事

说起tcp/ip协议中最复杂的一个协议,我觉得非tcp协议莫属,tcp协议位于传输层,是传输层两个协议其中之一,另一个就是udp协议

传输层位于应用层和网络层之间,是应用程序发送数据和接收数据的必经之地,如果你了解传输层的端口号,想必对数据如何给到真正的应用应该会熟悉,我们这里不做过多表述

现在我们讲讲两个应用以何种方式传送数据,这就涉及到tcp和udp的不同

tcp就如同是一对情侣分隔两个山头,当他们想把自己的东西送给对方时,由于看不见对方,他们需要喊话来确认对方是否准备好:

男:我给你扔一个苹果
女:好的,我给你扔一个梨
男:收到了,我再给你扔第二个苹果

他们就这样开始了互相投递食物的过程。这是tcp在三次握手以后通信的过程,发送的每份数据都会做标记,对方收到后都要做确认和回复

如果在扔的过程中水果掉到了山谷中,怎么办?

男:我给你扔一个苹果
女:…
男:(这么长时间没回复,是没接到吗?)我再重新给你扔一个苹果
女:好,我收到你扔的第一个苹果了

即使数据在传送的途中丢失,只要有超时重传机制,就可以实现数据的超时重传

如果某一方扔的速度太快,对方接不过来怎么办呢?

男:我给你扔一个苹果
女:好的,我给你扔一个梨
男:收到了,我再给你扔三个苹果
女:慢点,砸到我头了,我一次只能接二个
男:好,收到,我给你扔二个

tcp在通信过程中会不断地告知对方自己的最大接收能力,在tcp头中用window size表示,对方根据window size来调整自己发送数据的大小

如果他们的东西都扔完了,需要告诉对方,不然对方不知道,还在傻傻地等待

男:我东西扔完了哈
女:了解,我再看看我还有东西要给你吗?
女:我也没有了,那我可以撤了
男:好的,收到,我也撤了

tcp在数据发送完成后,需要断开连接,通过四次挥手完成,就像上面这样

聪明的你可能会问,一方完成传输后,发起了主动关闭的请求,但是对方数据没发完怎么办?

男:我东西扔完了哈
女:了解,我再看看我还有东西要给你吗?
女:你再等等,我还有水果没扔完,我扔一个给你
女:我再扔一个给你

女:好了,我没有了,我撤了
男:收到,撤吧

当主机A发送完数据后,主动发起关闭连接请求,这时候主机B收到关闭连接的请求,先回复一个确认信息给A,同时B这边不再接收数据,A收到确认信息后,也不再具有发送数据的能力,这是一个半关闭的状态

主机A虽然不具有发送的能力,但是有接收的能力,主机B虽然不具有接收的能力,但是有发送的能力,此时如果主机B还有数据未发送,仍然会继续发送,直到发送完毕

发送完毕后主机B会被动地发送一个断开连接的请求给A,A收到后,回复一个确认信息给B,这才是一个完整的关闭连接的过程

就这样,他们各自甜蜜地吃着对方送的东西,由于双方有不断喊话和确认的过程,他们都没有白白等待和遗漏对方的心意

然而有一天,他们吵架了,不再理睬对方,但是又还关心着对方,所以他们还是会把自己的水果扔给对方

男:我扔一个苹果
男:我再扔
女:我扔两个梨
女:我再扔
男:我再扔两个

男:扔完了,回去了,也不知道她收没收到
女:还剩几个,都扔过去

女:扔完了,走了,哼,管你接没接到,饿没饿死

这就是udp的传输过程,你只要有数据,知道对方在哪,你就一个劲地扔,你并不会问对方在不在,也不关心我的东西有没有掉,更不关心对方是不是会砸到头

udp就像一个二传手,负责把应用层的数据传递给网络层,至于其他,它并不关心,它只关心它自己,呸!


赞(0) 打赏
未经允许不得转载:IDEA激活码 » 聊聊tcp和udp那些事

相关推荐

  • 暂无文章

一个分享Java & Python知识的社区