TCP的主要特点:
1) TCP是面向连接的运输层协议。这就是说,应用程序在使用TCP协议之前,必须先建立TCP连接。在传送数据完毕后,必须释放已经建立的TCP连接。也就是说,应用程序之间的通信好像在”打电话“:通话前要事先拨号建立连接,通话结束后要挂机释放连接。
2) 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点(一对一)。
3) TCP提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复,并且按序到达。
4) TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能发送数据,TCP连接的两端都设有发送缓存和接受缓存,用来临时存放双向通信的数据。在发送时,应用程序在把数据传送给TCP缓存后,就可以做自己的事,而TCP在合适的时候就把数据发送出去。在接收时,TCP把收到的数据放入缓存,上层的应用进行在合适的时候读取缓存中的数据。
5) 面向字节流。 TCP中的“流”指的是流入到进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。TCP并不知道所传送的字节流的含义。TCP不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系(例如,发送方应用程序交给发送方的TCP共10个数据块,但接收方的TCP可能只用了4个数据块就把收到的字节流交付给上层的应用程序)。但接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。
TCP的连接
TCP把连接作为最基本的抽象。TCP的许多特性都与TCP是面向连接的这个基本特性有关。
每一条TCP连接有两个端点。那么,TCP连接的端点是什么呢?不是主机,不是主机的IP地址,不是应用进程,也不是运输层的协议端口。TCP连接的端点叫做套接字(socket)或插口。根据RFC793定义:端口号拼接到IP地址即构成了套接字。因此,套接字的表示方法是在点分十进制的IP地址后面写上端口号,中间用冒号或逗号隔开。如若IP地址是192.3.4.5而端口号是80,那么得到的套接字就是(192.3.4.5:80)。总之,我们有:
套接字socket = (IP地址:端口号)
每一条TCP连接唯一地被通信两端的两个端点(即两个套接字)所确定。即:
TCP 连接 ::= {socket1,socket2} = {(IP1:port1), (IP2 : port2)}
同一个IP地址可以有多个不同的TCP连接,而同一个端口号也可以出现在多个不同的TCP连接中。