TCP协议相比于UDP要复杂的多,所以这次暂时先只对TCP做个概述,接下来再慢慢深入,包括TCP可靠传输、流量控制、拥塞控制等问题。
1、TCP 特点
(1)TCP 是面向连接的
即应用程序在使用TCP协议之前,必须先建立TCP连接,传输完数据报之后,再断开此连接。
(2)每条TCP连接只能有两个端点(点对点)
(3)TCP提供可靠交付的服务
TCP 有一系列的机制来确保接收到的数据的正确性,完整性。
(4)TCP 提供全双工通信
TCP允许通信双方的应用程序在任何时候发送数据,TCP连接的两端都发送缓存和接收缓存,用来临时存放数据。
发送时:应用程序在把数据传送给TCP的缓存后,就可以干自己的事了,而TCP在合适的时候就会把数据发送出去。
接收时:TCP把收到的数据放入缓存,上层的应用进程在合适的时候,就会读取缓存中的数据。
(5)面向字节流
虽然应用程序和TCP的交互式一次一个数据块(大小不等),但TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流。TCP不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块大小对应(例如,发送方应用程序交给发送方的TCP共10个数据块,但接收方的TCP可能只用了4个数据块就把收到的字节流交付给上层的应用程序)。但是接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。
下面附上一个图,结合图,更好的来理解字节流


TCP和UDP在发送报文时所采用的方式完全不同。
TCP对应用程序一次把多长的报文发送到TCP的缓存中是不关心的。它根据对方给出的窗口值和当前网络拥塞程度来决定一个报文段应包含多少个字节。
UDP 发送的报文长度,则是有应用程序给出的。
如果应用程序传送到TCP缓存的数据块太长,TCP就可以把其划分短一些再传送。如果应用程序一次只发来一个字节,TCP也可以等待积累到足够多的字节后再构成报文段发送出去。
2、TCP的连接
有一点需要指出的是,TCP连接的端点,不是主机,不是主机IP地址,不是应用程序,不是协议端口号,而是套接字socket。
套接字socket = (IP地址 : 端口号)
也就是说将端口号拼接到IP地址上,就构成了套接字,例如192.168.1.100:80
由此可见
同一个IP地址可以有多个不同的TCP连接
同一个端口号也可以出现在多个不同的TCP连接中