| ***、确认号及标志位 | 含义 |
|---|---|
| *** seq | 占 4 个字节,用来标记数据段的顺序,TCP 把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本机随机产生,给字节编上序号后,就给每一个报文段指派一个序号,***seq就是这个报文段中的第一个字节的数据编号 |
| 确认号ack | 占 4 个字节,期待收到对方下一个报文段的第一个数据字节的序号,***表示报文段携带数据的第一个字节的编号,而确认号指的是期望接受到下一个字节的编号,因此挡墙报文段最后一个字节的编号 +1 即是确认号 |
| 确认ACK | 占1个比特位,仅当 ACK=1,确认号字段才有效。ACK=0,确认号无效 |
| 同步SYN | 连接建立时用于同步序号。当 SYN=1,ACK=0 表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使用 SYN=1,ACK=1。因此,SYN=1 表示这是一个连接请求,或连接接收报文,SYN 这个标志位只有在 TCP 建立连接才会被置为 1,握手完成后 SYN 标志位被置为 0 |
| 终止FIN | 用来释放一个连接 |
理解TCP***(Sequence Number)和确认号(Acknowledgment Number)
seq 是***,这是为了连接以后传送数据用的,ack 是对收到的数据包的确认,值是等待接收的数据包的***
在第一次消息发送中,A 随机选取一个***作为自己的初始序号发送给 B;第二次消息 B 使用 ack 对 A 的数据包进行确认,因为已经收到了***为x的数据包,准备接收***为 x+1 的包,所以 ack=x+1,同时 B 告诉 A 自己的初始***,就是 seq=y;第三条消息 A 告诉 B 收到了B的确认消息并准备建立连接,A 自己此条消息的***是 x+1,所以 seq=x+1,而 ack=y+1 是表示 A 正准备接收 B ***为 y+1 的数据包。同理四次挥手也是通过 seq=x+1、ack=y+1 确认结束
seq 是数据包本身的***;ack 是期望对方继续发送的那个数据包的***
TCP 三次握手
- 第一次握手:
A 的 TCP 客户进程也是首先创建传输控制块 TCB,然后向 B 发出连接请求报文段,(首部的同步位 SYN=1,初始序列 seq=x),(SYN=1 的报文段不能携带数据)但是要消耗掉一个序号,此时 TCP 客户进程进入 SYN-SENT (同步已发送)状态 - 第二次握手:
B 接收到连接请求报文段后,如果同意连接,则向 A 发送确认,在确认报文段中(SYN=1,ACK=1,确认号 ack=x+1,初始序号 seq=y),测试 TCP 服务器进程进入 SYN-RCVD(同步收到)状态 - 第三次握手:
TCP 客户进程收到 B 的确认后,要向 B 给出确认报文(ACK=1,确认号 ack=y+1,序号 seq=x+1)(初始为 seq=x,第二个报文段所以要 +1),ACK 报文段可以携带数据,不携带数据则不消耗序号。TCP 连接已经建立,A 进入 ESTABLISHED (已建立连接)状态
TCP 四次挥手
- A 的应用进程先向其 TCP 发出连接释放报文段(FIN=1,序号 seq=u),并停止再发送数据,主动关闭 TCP 连接,进入 FIN-WAIT-1(终止等待1)状态,等待 B 的确定
- B 收到连接释放报文段后即发出确认报文段,(ACK=1,确认号 ack=u+1,序号 seq=v),B 进入 CLOSE-WAIT (关闭等待)状态,此时的 TCP 处于半关闭状态,A 到 B 的连接释放
- A 收到 B 的确认后,进入 FIN-WAIT-2 (终止等待2)状态,等待 B 发出的连接释放报文段
- B 没有要向 A 发出的数据,B 发出连接释放报文段(FIN=1,ACK=1,序号 seq=w,确认号 ack=1),B 进入 LAST-ACK (最后确认)状态,等待 A 的确认
- A 收到 B 的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),A 进入 TIME-Wait (时间等待)状态。此时 TCP 未释放掉,需要经过时间等待计时器设置的时间 2MSL 后,A 才进入 CLOSED 状态