您现在的位置是:首页 >技术交流 >传输控制协议(TCP)知识点总结网站首页技术交流
传输控制协议(TCP)知识点总结
传输控制协议(TCP)知识点总结
维基百科:
传输控制协议(TCP)是Internet协议套件中的主要协议之一。它起源于最初的网络实现中,它补充了Internet协议(IP)。因此,整个套件通常称为TCP/IP。TCP在通过IP网络通信的主机之间提供可靠的、有序的、经过检查的字节流传输。主要的互联网应用程序,如万维网、电子邮件、远程管理和文件传输,都依赖于TCP,它是TCP/IP套件的传输层的一部分。SSL/TLS通常运行在TCP之上。
TCP是面向连接的,客户端和服务器之间必须建立连接后才能发送数据。在建立连接之前,服务器必须在等待(被动打开)来自客户端的连接请求。三次握手(主动打开)、重传和错误检测增加了可靠性,但也延长了延迟时间。不需要可靠数据流服务的应用程序可以使用用户数据报协议(UDP),它提供了一个无连接的数据报服务,优先考虑时间而非可靠性。TCP采用网络拥塞避免。但是,TCP存在漏洞,包括拒绝服务攻击、连接劫持、TCP否决和重置攻击。
数据在TCP层称为流(Stream),数据分组称为分段(Segment)。作为比较,数据在IP层称为Datagram,数据分组称为分片(Fragment)。 UDP 中分组称为Message。
介绍
传输控制协议(TCP
)是一种在IP
之上使用的传输协议,用于确保数据包的可靠传输。
TCP
拥有一些机制,可以解决数据包传输的传递中出现的许多问题,例如数据包丢失、数据包乱序、数据包重复和数据包损坏。
由于TCP
是IP
之上最常用的协议,因此Internet
协议栈有时也称为TCP/IP
。
数据包格式
使用TCP/IP
发送数据包时,每个IP
数据包的数据部分被格式化为TCP
段。
TCP连接的建立和关闭
三次握手
任何TCP连接在建立之前都需要经过三次握手,确保通信双方都能正确的接收和发送数据,这也是TCP可靠性的保障之一。
让我们来研究一下TCP三次握手的过程:
下图是使用wireshark
捕获到的三次握手的过程(服务端监听的端口为8888
):
- 首先客户端(图中端口14243)先向服务端(图中端口8888)发送一个同步位SYN被设置为1的TCP报文段,用来表明这是一个TCP连接请求报文段,并将Seq需要字段设置为x(上图中的连接的x是0),表明客户端选择x作为这个连接的初始序号。发送该报文段后,客户端进入同步发送状态(SYN-SENT)。
- 然后服务端收到客户端的TCP连接请求报文段后,服务端同意连接后会向请求的客户端回复一个请求确认报文,这个报文的同步位SYN和确认位ACK都被置为1,序号Seq设置为y(上图是y=0),确认号字段ack被设置为x+1(对于图中连接来说就是x+1=0+1=1)。发送该报文段后,服务端进入同步接收状态(SYN-RECEIVED)。
- 最后,在客户端收到服务端发送的请求确认报文段后会回复一个确认报文段,该报文的确认位ACK置1,序号seq置为x+1,确认号字段ack置为y+1。发送该报文段后,客户端进入已建立连接状态(ESTABLISHED)
- 服务端接收到客户端发出的确认报文段后也进入已建立连接状态(ESTABLISHED)。
注意:TCP规定SYN被设置为1的报文段不能携带数据而且会消耗掉一个序号。在三次握手的第三次回复中,该报文段没有设置SYN为1,所以它是可以携带数据的。但如果不携带数据则不消耗序号,这时下一次发送的报文段的Seq还是x+1。
下图展示了三次握手的过程:
四次挥手
TCP在关闭连接时会进行四次挥手,这确保了数据能够完整地传输并且双方都能正常关闭连接。
下图是wireshark
捕获的一次TCP连接的四次挥手记录
- 首先假设挥手的发起者是客户端(图中端口4676),则客户端会发送一个终止位FIN和确认位ACK置为1的报文段,表示客户端想要释放该TCP连接,并将序号Seq设置为u(即该连接请求断开之前已传送过的数据的最后一个字节的序号加1,图中Seq为6),ack置为v(即该连接请求断开之前已收到的数据的最后一个字节的序号加1,图中ack为14)。发送该报文段后,客户端进入终止等待1状态(FIN-WAIT-1)。
- 之后,服务端收到该连接终止请求的报文段,服务端会立即回复一个确认报文段,该报文段的确认位ACK置为1,序号Seq置为v,确认号字段ack置为u+1。发送该确认报文段后,服务端进入关闭等待状态(CLOSE-WAIT)。
- 在服务端发送确认报文段后,表明客户端到服务端的连接就被释放了,现在该连接处于半关闭状态,客户端不再向服务端发送数据,但是服务端如果还有数据要发送,客户端仍然会接收,这个状态会持续到服务端确认没有数据传输后,主动发出终止连接的报文段。
- 在客户端收到服务端发来的确认报文段后,会进入终止等待2状态(FIN-WAIT-2)。该状态会一直等待服务端发出的终止连接的报文段。
- 在服务端确认没有数据要发送时,会通知终止连接,并发出一个终止连接的报文段。该报文段的终止位FIN和确认位ACK置为1,序号Seq置为w(如果服务端在半关闭状态下发送了数据那么Seq就会变化,如果没有发送数据,那么Seq=v),确认号字段ack还是置为u+1。发送该报文段后,服务端进入最后确认状态(LAST-ACK)。
- 客户端在接收到服务端发来的终止连接的报文段后,会回复一个确认报文段,该报文段确认位ACK置为1,序号Seq置为u+1,确认号字段ack置为w+1。该报文段发送后,客户端进入时间等待状态(TIME-WAIT)。
- 服务端在收到客户端发来的确认报文段后,会进入已关闭状态(CLOSED)。而客户端需要等待2MSL的时间后才会从时间等待状态(TIME-WAIT)进入已关闭状态(CLOSED)。(MSL(Maximum Segment Lifetime)即报文段最大生存时间,RFC793建议为2分钟)。
注意:TCP规定终止位FIN置为1的报文段即使不携带数据,也要消耗掉一个序号
下图展示了四次挥手的过程:
一张图展示这些过程
其他知识
- 在TCP连接中,服务端使用一个五元组(
源IP地址,源端口,目的IP地址,目的端口,协议类型
)来唯一标识客户端的连接。当服务端监听一个端口时,它会接受来自任何源IP地址和源端口号的连接请求,但是每个连接都必须具有唯一的目的IP地址、目的端口号和协议类型。