什么是TCP
TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,在发送数据前,通信双方必须在彼此间建立一条连接。所谓的“连接”,其实是客户端和服务端保存的一份关于对方的信息,如ip地址、端口号等。
TCP可以看成是一种字节流,它会处理IP层或以下的层的丢包、重复以及错误问题。在连接的建立过程中,双方需要交换一些连接的参数。这些参数可以放在TCP头部。
一个TCP连接由一个4元组构成,分别是两个IP地址和两个端口号。一个TCP连接通常分为三个阶段:连接、数据传输、退出(关闭)。通过三次握手建立一个链接,通过四次挥手来关闭一个连接。
TCP报文的头部结构
上图中有几个字段需要重点介绍下:
(1)序号:seq
序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
(2)确认序号:ack
序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。如果你向对方回复了 ack = 31, 代表着你已经收到了序号截止到30的数据,期待的下一个数据起点是 31 。
(3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN
等,具体含义如下:
SYN:(Synchronize Sequence Numbers)发起一个新连接。
ACK:(Acknowledge character)确认序号有效。
FIN:释放一个连接。
PSH:接收方应该尽快将这个报文交给应用层。
RST:重置连接。
URG:紧急指针(urgent pointer)有效。
需要注意的是:
-
不要将
确认序号ack
与标志位ACK
搞混了。 -
TCP标准规定:
SYN报文段(即SYN = 1的报文段)不能携带数据,但是要消耗掉一个序号,
所以前两次握手客户端和服务端都需要向对方回复 ack = x+1 或 y+1 。
ACK报文段可以携带数据&