UDP 的主要特点
1.无连接。发送数据之前不需要建立连接,发送数据结束后也不需要释放,因此减少了开销和发送数据之前的延迟。
2.UDPS使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表(这里有很多的参数)。
3.UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。UDP面对应用层交下来的报文既不合并也不拆分,而是保留这些报文的边界。保留边界即:发送方连续发送数据,即使接收方的的缓冲区足够大,也只会一次一次的接收,发送多少次接收多少次,即发送方是分几次发送过来的,接收方也必须按几次接收。
对于TCP协议,发送方连续发送数据,只接收方的缓冲区足够大,会一次性接收全部数据,对于发送方分几次发送数据,每包数据都是有边界的,而接收方一次性读取缓冲区内的数据,数据看起来就是无边界的;
4.UDP没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低。
5.UDP支持一对一、一对多、多对一和多对多的交互通信。
6.UDP的首部开销小,只有8个字节,比TCP的20个字节的首部要短。
TCP 的主要特点
1.TCP面向连接。应用程序在使用TCP协议之前先建立TCP连接,并且在传送数据完毕后,必须释放已经建立的连接,类似以“打电话”,双方都接通后才能通话,通话结束后要挂掉电话。
2.TCP连接只能有连个端点,即点对点(一对一)。
3.TCP提供可靠交付,通过TCP连接传送的数据,无差错、不丢失、不重复,按序到达。
4.TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能发送数据。TCP连接的两端设置有发送缓冲区和接收缓冲区,用来临时存放双向通信的数据,在发送时,应用程序在把数据传送给TCP缓存后,就可以做自己的事情,而TCP在合适的时候把数据发送出去。在接收时,TCP把收到的数据放入缓存,上层应用进程在合适的时候读取缓存中的数据。
5.面向字节流。“流”(stream)指的是流入到进程或从进程流出的字节序列。虽然应用程序和TCP的交互是一次一个数据块(大小不等),但tcp把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。TCP并不知道传送的字节流的含义。TCP不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系(例如:发送方应用程序交给发送方的TCP共10个数据块,但是接收方可能只用了4个数据块就把收到的字节流交付上层的应用程序),但是接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。接收方的应用程序必须有能力识别收到的字节流,把它还原成有意义的应用层数据。
示意图如下,其中包含信息:
1.箭头表示数据流的方向,下图只画出了一个方向的数据流
2.图的最下方并非指的是真正的物理连接,仅仅指的是一条逻辑连接。TCP报文段先要传送到IP层,加上IP首部后,再传送到数据链路层。再加上数据链路层的首部和尾部后,才离开主机发送到物理链路。
3.TCP和UDP在发送报时所采用的方式是完全不同的。TCP不关心应用进程一次把多长的报文发送到TCP缓冲区,而是根据对方给出的窗口值和当前网络的拥塞程度决定一个报文段包含多少个字节(UDP发送的报文长度是应用进程给出的)。如果应用进程传送到TCP缓存的数据块太长,TCP就划分短一些再传送。如果应用进程一次只发来一个字节,TCP就等待积累有足够多的字节后再构成报文段发送出去。 图中报文的长度大小不等,就说明了这种情况。
TCP的连接
TCP把连接作为最基本的抽象。TCP连接的端点叫套接字(scoket)或插口,IP地址拼接端口号(中间以冒号隔开),即构成套接字,表示如下:
套接字 scoket = (IP地址:端口号)
每一条TCP连接唯一地被通信两端的两个端点(即两个套接字)所确定,即:
TCP连接 ::= {socket1,socket2} = { (IP1:port1), (IP2:port2) }
由以上可以看出,同一个IP地址可以有多个不同的TCP连接(端口号可以不同),同一个端口号同样也可以对应多条不同的连接(IP地址可以不同)。
注意:这里的套接字不同于系统调用API函数接口