TCP的定义
TCP全称为Transmission Control Protocol(传输控制协议),是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。
TCP的作用
(1)面向连接的、可靠地、基于字节流的传输层通信协议
(2)将应用层的数据流分割成报文段并发送给目标节点的TCP层
(3)数据包都有序号,对方收到则发送ACK确认,未收到则重传
(4)使用校验和来检验数据在传输过程中是否有误
TCP报文段的组成
- ①序号:Seq(Sequence Number)序号占32位,用来标识从计算机A发送到计算机B的数据包的序号,计算机发送数据时对此进行标记。
- ②确认号:Ack(Acknowledge Number)确认号占32位,客户端和服务器端都可以发送,Ack = Seq + 1。
- ③标志位:每个标志位占用1Bit,共有6个,分别为 URG、ACK、PSH、RST、SYN、FIN,具体含义如下:
- ①序号:Seq(Sequence Number)序号占32位,用来标识从计算机A发送到计算机B的数据包的序号,计算机发送数据时对此进行标记。
- ②确认号:Ack(Acknowledge Number)确认号占32位,客户端和服务器端都可以发送,Ack = Seq + 1。
- ③标志位:每个标志位占用1Bit,共有6个,分别为 URG、ACK、PSH、RST、SYN、FIN,具体含义如下: 这里请记住标志位各部分的缩写和含义,对理解tcp三次握手和4次挥手也是有帮助的
- URG(紧急位) :表示本报文段中发送的数据是否包含紧急数据。后面的紧急指针字段(urgent pointer)只有当URG=1时才有效
- ACK(确认位): 表示是否前面确认号字段是否有效。只有当ACK=1时,前面的确认号字段才有效。TCP规定,连接建立后,ACK必须为1,带ACK标志的TCP报文段称为确认报文段
- PSH(急切位): 提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间。如果为1,则表示对方应当立即把数据提交给上层应用,而不是缓存起来,如果应用程序不将接收到的数据读走,就会一直停留在TCP接收缓冲区中
- RST(重置位): 如果收到一个RST=1的报文,说明与主机的连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。或者说明上次发送给主机的数据有问题,主机拒绝响应,带RST标志的TCP报文段称为复位报文段
- SYN(同步位): 在建立连接时使用,用来同步序号。当SYN=1,ACK=0时,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中SYN才置为1,带SYN标志的TCP报文段称为同步报文段
- FIN(断开位): 表示通知对方本端要关闭连接了,标记数据是否发送完毕。如果FIN=1,即告诉对方:“我的数据已经发送完毕,你可以释放连接了”,带FIN标志的TCP报文段称为结束报文段
**TCP的连接(3次握手,4次挥手)
三次握手
上图即为tcp的三次握手过程,即两主机之间建立连接的过程:
- pc1向pc2发送连接syn报文,连接请求
- pc2接受pc1的请求后回复 SYN+ACK 报文,并为这次连接分配资源
- pc1接收到 ACK 报文后也向 pc2 段发生 ACK 报文,并分配资源,这样 TCP 连接就建立了,此步骤是为了验证pc1的接收能力
四次挥手
聚散终有时,TCP 断开连接是通过四次挥手方式。
双方都可以主动断开连接,断开连接后主机中的「资源」将被释放。
上图是客户端主动关闭连接 :
- 第一次挥手 :客户端打算关闭连接,此时会发送一个 TCP 首部
FIN标志位被置为1的报文,也即FIN报文,之后客户端进入终止等待状态。 - 第二次挥手 :服务端收到该报文后,就向客户端发送
ACK应答报文,接着服务端进入关闭等待状态, - 第三次挥手 :客户端收到服务端的
ACK应答报文后,之后进入终止等待2状态。等待服务端处理完数据后,也向客户端发送FIN报文,之后服务端进入最后确认状态。 - 第四次挥手 :客户端收到服务端的 FIN 报文后,回一个 ACK 应答报文,之后进入 TIME_WAIT 状态
- 服务器收到了 ACK 应答报文后,就进入了 CLOSED 状态,至此服务端已经完成连接的关闭。
- 客户端在经过 2MSL 一段时间后,自动进入 CLOSED 状态,至此客户端也完成连接的关闭 此时已经完成tcp传输过程