定义
传输控制协议(TCP)是一种面向连接的,可靠的,基于字节流的传输层通信协议。在OSI模型中,它完成了第四层传输层所指定的功能,用户数据报协议(UDP)是同一层另外一个重要的传输协议。
功能:
应用层向TCP层发送用于网间传输的,用8位字节表示的数据流,然后TCP把数据流区分成适当长度的报文段,再把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。
运作方式:
TCP连接包括三个状态:连接创建,数据传送和连接终止。操作系统将TCP连接抽象为套接字的编程接口给程序使用,并且要经历一系列的状态改变。
- 连接创建:通过“三次握手”过程来创建一个连接。
- 客户端通过向服务器端发送一个SYN来创建一个主动打开,并且将这段连接的序号设定为随机数A。
- 服务器端接收到SYN后,会回送一个SYN/ACK,其中ACK的确认码为A+1,SYN/ACK包本身又有一个随机序号B。
- 最后,客户端再发送一个ACK,当服务器端接收到这个ACK后,就完成了三次握手,并进入了连接状态。此时包序号被设定为收到的确认号为A+1,而响应为B+1;
- 数据传输:
在TCP的数据传送状态,很多重要的机制保证了TCP的可靠性和强壮性。它们包括:使用序号,对收到的TCP报文段进行排序以及检测重复的数据;使用校验和来检测报文段的错误;使用确认和计时器来检测和纠正丢包或延时。
a. 序列号和确认:
在TCP的连接创建状态,两个主机的TCP层间要交换初始序号。这些序号用于标识字节流中的数据,并且还是对应用层的数据字节进行记数的整数。通常在每个TCP报文段中都有一对序号和确认号。TCP报文发送者认为自己的字节编号为序号,而认为接收者的字节编号为确认号。TCP报文的接收者为了确保可靠性,在接收到一定数量的连续字节流后才发送确认。
通过使用序号和确认号,TCP层可以把收到的报文段中的字节按正确的顺序交付给应用层。
简而言之,就是为了确保TCP层可以把收到的报文按正确的顺序交给应用层,发送方发送序列号,接收方发送确认。
b. 校验和:
发送者将TCP报文段的头部和数据部分的和计算出来,再对其求反码(一的补数),就得到了校验和,然后将结果装入报文中传输。接收者在收到报文后再按相同的算法计算一次校验和。这里使用的反码使得接收者不用再将校验和字段保存起来后清零,而可以直接将报文段连同校验加总。如果计算结果是全部为一,那么就表示了报文的完整性和正确性。
简而言之,发送方发送一个校验和,接收方接收后,进行计算比较,如果正确无误,则进行接受,否则丢弃,保证了报文被错误地路由。
c. 流量控制和阻塞管理:
流量控制用来避免主机分组发送得过快而使接收方来不及完全收下。
- 终结通路:通过四次挥手实现
具体过程:
假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!
TCP数据包结构:
- 来源连接端口(16位长)-辨识发送连接端口
- 目的连接端口(16位长)-辨识接收连接端口
- 序列号(seq,32位长)
- 确认号(ack,32位长)—期望收到的数据的开始序列号。也即已经收到的数据的字节长度加1。
- 报头长度(4位长)—以4字节为单位计算出的数据段开始地址的偏移值。
- 保留—须置0
- 标志符
URG—为1表示高优先级数据包,紧急指针字段有效。
ACK—为1表示确认号字段有效
PSH—为1表示是带有PUSH标志的数据,指示接收方应该尽快将这个报文段交给应用层而不用等待缓冲区装满。
RST—为1表示出现严重差错。可能需要重现创建TCP连接。还可以用于拒绝非法的报文段和拒绝连接请求。
SYN—为1表示这是连接请求或是连接接受请求,用于创建连接和使顺序号同步
FIN—为1表示发送方没有数据要传输了,要求释放连接。 - 窗口(WIN,16位长)—表示从确认号开始,本报文的源方可以接收的字节数,即源方接收窗口大小。用于流量控制。
- 校验和(Checksum,16位长)—对整个的TCP报文段,包括TCP头部和TCP数据,以16位字进行计算所得。这是一个强制性的字段。
- 紧急指针(16位长)—本报文段中的紧急数据的最后一个字节的序号。
- 选项字段—最多40字节。每个选项的开始是1字节的kind字段,说明选项的类型。
0:选项表结束(1字节)
1:无操作(1字节)用于选项字段之间的字边界对齐。
2:最大报文段长度(4字节,Maximum Segment Size,MSS)通常在创建连接而设置SYN标志的数据包中指明这个选项,指明本端所能接收的最大长度的报文段。通常将MSS设置为(MTU-40)字节,携带TCP报文段的IP数据报的长度就不会超过MTU,从而避免本机发生IP分片。只能出现在同步报文段中,否则将被忽略。
3:窗口扩大因子(4字节,wscale),取值0-14。用来把TCP的窗口的值左移的位数。只能出现在同步报文段中,否则将被忽略。这是因为现在的TCP接收数据缓冲区(接收窗口)的长度通常大于65535字节。
4:sackOK—发送端支持并同意使用SACK选项。
5:SACK实际工作的选项。
8:时间戳(10字节,TCP Timestamps Option,TSopt) - 发送端的时间戳(Timestamp Value field,TSval,4字节)
- 时间戳回显应答(Timestamp Echo Reply field,TSecr,4字节)