一、TCP协议简介
TCP协议,即传输控制协议(Transmission Control Protocol),是一种面向连接的、可靠的、基于字节流的传输层通信协议。在因特网协议族中,TCP层是位于IP层之上,应用层之下的中间层。尽管IP层只能提供不可靠的包交换(只提供尽最大努力的交付服务),但是TCP协议能够为不同主机的应用层之间提供可靠的、像管道一样的连接,相当于一条全双工的可靠信道。
二、TCP协议的主要特点
(1)面向连接的
应用程序在使用TCP协议之间,必须先建立TCP连接;在传输完数据之后,必须释放已经建立的TCP连接。
(2)端到端的通信
每一条TCP连接只能有两个端点,只能是点对点的。因此TCP协议不提供广播或多播服务。
(3)提供可靠的交付服务
TCP协议能够确保传输数据的正确性,无差错、不丢失、不重复、并且按序到达。
(4)提供全双工通信
TCP协议提供双向的数据传输服务。TCP协议允许通信双方的应用进程在任何时候发送数据。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。
(5)面向字节流
TCP中的“流”是指流入到进程或从进程流出的字节序列。
(6)提供流量控制
TCP使用滑动串口可以实现流量控制,让发送方的发送速率不要太快,让接收方来得及接收。
(7)提供拥塞控制
三、TCP的连接
每条TCP连接都有两个端点,TCP的端点叫做套接字(socket)。套接字的定义如下:
套接字 socket = (IP地址:端口号)
每一条TCP连接唯一地被通信的两个端点所确定:
TCP连接 ::= {socket1,socket2} = {(IP1:port1),(IP2:port2)}
Berkeley套接字API主要函数如下图所示:
java在包java.net中提供了两个类Socket和ServerSocket,分别用来表示双向连接的客户端和服务端。
四、TCP报文段首部结构
TCP虽然是面向字节流的,但是TCP传输的数据单元却是报文段,叫做TCP报文段。
TCP报文段的首部格式如下图所示:
首部固定部分各字段意义如下:
(1)源端口
占2个字节,写入源端口。
(2)目的端口
占2个字节,写入目的端口。
(3)序号
占4个字节,序号范围是[0,2^32-1]。序号增加到2^32-1之后,下一个需要就又回到0。
在TCP连接中传输的字节流中的每一个字节都按照顺序编号。首部中的序号字段的值指的是本报文段所发送数据的第一个字节的序号。
例如:
如果当前发送的报文段的序号字段值是301,发送的数据长度为200,那么下一个报文段的序号字段值则应该为501。
(4)确认号
占4个字节,是期望收到对方下一个报文段的第一个数据字节的序号。
例如:如果B收到了A发送的报文段,序号字段值是401,数据长度为300(401~700),如果B正确收到了A发送的序号到700为止的数据,则B期望收到A的下一个报文段的序号则是701,于是B在发送给A的确认报文段中将确认号的值置为701。
(5)数据偏移
占4位(半个字节),它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远,即TCP报文段的首部长度。4位最大能表示的十进制数是15,数据偏移的单位是4字节,则TCP首部长度最大值是60字节。因为首部有20字节的固定首部,则选项长度最大是40字节。
(6)保留
占6位,保留为今后使用,应置为0。
(7)紧急URG
当URG=1时,表示该报文段中有紧急数据,应当尽快传送。
(8)确认ACK
仅当ACK=1时,确认号字段才有用。当ACK=0时,确认好无效。TCP规定在建立连接之后传送的所有报文段都必须把ACK直为1。
(9)推送PSH
当两个应用进程在进行交互式的通信时,如果发送方把PSH置为1,就表示希望接收方在收到该TCP报文段之后,应该立即交付给接收方的应用进程,而不是等到整个缓存满了再向上交付。
(10)复位RST
当RST=1时,表明TCP连接出现了严重的错误,必须释放连接,然后再重新建立连接。
(11)同步SYN
在建立连接时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。若对方同意建立连接,则应该在响应报文段中让SYN=1和ACK=1。
(12)终止FIN
用来释放一个连接,当FIN=1时,表示此报文段的发送方的所有数据都已经发送完毕,请求释放连接。
(13)窗口
占2个字节,取值范围[0,2^16-1]。窗口指的是发送此报文段的那方的接收窗口的大小(从报文段首部的确认号算起,到报文段末尾)。窗口值作为接收方让发送方设置其发送窗口的依据。
(14)检验和
占2个字节,用来检验报文段的首部和数据两个部分,在计算检验和时,需要在报文段首部加上12个字节的伪首部。
(15)紧急指针
占2个字节,仅当URG=1时有意义,紧急指针指明了报文段中紧急数据的末尾在报文段中的位置,指针位置之前是紧急数据,之后为普通数据。即使窗口为0式也可以发送紧急数据。
(16)选项
长度可变,最长40个字节。
(17)填充
为了在使用选项之后,使整个首部长度是4字节的整数倍。
五、TCP提供可靠传输的工作原理
可靠传输的条件有如下两个要求:
(1)传输信道不产生差错;
(2)传输数据能够正确按序接收到。又分为两个部分,一是传输的数据丢失之后能够正确传输,二是无论发生方以多快的速度发送数据,接收方总是来得及处理接收到的数据。
对于第一个要求,TCP采用三次握手来建立连接,四次握手来释放连接,来保证建立的传输信道是可靠的。
对于第二个要求,TCP采用了连续ARQ协议(回退N,Go-back-N;超时自动重传)来保证数据传输不出差错,另外使用滑动窗口协议来保证接收方能够及时处理所接收到的数据。
----------------------------------------------------------------------------------------------------------------------------------------------------------------
参考文献:
1、传输控制协议-维基百科
https://zh.wikipedia.org/wiki/%E4%BC%A0%E8%BE%93%E6%8E%A7%E5%88%B6%E5%8D%8F%E8%AE%AE
2、TCP传输协议的服务特点http://network.51cto.com/art/201006/204689.htm
3、TCP协议和UDP协议 http://dongruan00.iteye.com/blog/1825896
4、Berkeley套接字-维基百科
https://zh.wikipedia.org/wiki/Berkeley%E5%A5%97%E6%8E%A5%E5%AD%97#.E5.A5.97.E6.8E.A5.E5.AD.97API.E5.87.BD.E6.95.B0
5、Linux Socket编程(不限Linux)http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html
6、TCP数据报首部 http://blog.chinaunix.net/uid-26413668-id-3408115.html