最近在学习网络编程,还是写点笔记来督促下自己,边写边学才不至于懒惰。
我其实一直对网络通信很是好奇,以前也经常想网络游戏和聊天软件是如何使用户互连并进行通信的呢?后来接触到套接字,并且还能做些简单的通信,但对其中的工作原理浑然不知,凡事总是如此,你不想被某事束缚或牵着鼻子走,就总会想着去了解更深一层的东西。以让其为你所用,方便自如,进入正题。首先介绍TCP和UDP。
在介绍这两种协议之前,不得不把OSI 7层结构摆出来,毕竟他们也只是其中的一层而已。
OSI 7层结构由上至下分为:
应用层 表示层 会话层 传输层 网络层 数据链路层 物理层
而TCP、UDP协议则位于传输层,用过套接字的人都知道套接字有不同的类型,不同类型的套接字制定不同的传输协议。当我们通过套接字来发送信息是,数据就被封装到一个TCP数据报或UDP数据报中。所谓协议也就是双方彼此统一的数据格式和通信规则。
TCP和UDP虽然同为传输协议,但有非常大的区别。UDP只能说是简单的传输协议,它提供的是一种无连接的服务。何为无连接?就是说它不必事先和服务端建立连接就可以直接传送数据报。自身不提供校验和重传机制,数据报一旦发出去,便与它无关系了。所以它是一种不可靠的传输协议。
而TCP则不同,它可谓是集多功能一体的“变形金刚”,首先它是基于连接的传输协议,也就是说在与接收端通信前必须先建立一条连接,如何建立连接?那就要通过家喻户晓的“三次握手”来实现了,那连接的目的是什么呢?我们都知道“三次握手”中相互传递的事SYN和ACK,而SYN中包含了多个TCP选项,比如说,MSS、窗口规模等。所谓的连接并非是明确从源端到目的端的一条路由,我想应该是明确和协商对方的配置信息。比如说窗口大小、每个TCP分节愿意接受的最大数据量。
不但如此,TCP协议还提供重传、校验、序列号等机制,保证了数据的完整性、可靠性、无冗余,这些在UDP中是见不到的。那岂不是说TCP完胜UDP?非也!不同协议自然有其用武之地,TCP有如此多的装备,自然其复杂性可想而知肯定很高,传输过程越复杂,其速率自然也就相应较低。UDP虽然简单,但也保证了它的传输速度绝对一流,对于小型数据,UDP的效率足够让你开怀大笑。像偶尔也会玩的CF,它用的就是UDP,要是用TCP,虽然不是我设计的游戏,但可以想象一下,如果网络不太好,那岂不是你一直在玩“情景重现”,因为至少有重传机制吧。(我瞎猜的,呵~)
其实要了解两者的不同,大可以去看看他们的各自的协议数据报格式,奥秘就自然在其中。