TCP报文格式
面试
- 序号:seq序号,占32位,标识从TCP源端向目的端发送的字节流,发起方发送数据时对此标记
- 确认号:ack,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1
- 标志位有6个
- URG:紧急指针有效
- ACK:确认序号有效
- PSH:接收方应该尽快将这个报文交给应用程序,为后续数据腾出空间
- RST:重置链接
- SYN:发起一个新链接
- FIN:释放一个链接
TCP三次握手

三次握手过程
三次握手由客户端触发
- 第一次握手:首先客户端将标志位SYN设为1,随机产生一个值seq=x,并将该数据包发送给服务器,客户端计入SYN_SENT状态,等待服务器确认。
- 第二次握手:服务器收到数据包有标志位SYN=1,知道是客户端请求创建链接,服务器此时将SYN和ACK都设为1,ack=J+1,随机产生一个seq=K,
而且将该数据包发送给客户端以确认链接请求,此时服务器进入SYN_RCVD状态。
- 第三次握手:客户端收到确认后,检查ACK是否为1,ack是否为J+1,若是正确则将标志位ACK置为1,ack=K+1,并将数据包发送给服务器,
服务器检查ack是否为K+1,ACK是否为1,若是正确则双方数据通讯成功,此时客户端和服务端都进入ESTABLISHED状态。
TCP四次挥手
四次挥手能够由客户端或服务器来触发
四次挥手过程

- 第一次挥手:客户端发送一个FIN,用来关闭客户端与服务器的数据传送,此时客户端进去FIN_WAIT_1状态
- 第二次挥手:服务器收到FIN后,发送一个ACK给客户端,而且确认序号为收到序号+1(一个FIN占用一个序号),此时服务器进入CLOSE_WAIT状态
- 第三次挥手:服务器发送一个FIN,用来关闭服务器到客户端的数据传送,此时服务器进到LAST_ACK状态
- 第四次挥手:客户端收到FIN后,进入TIME_WAIT状态,向服务器发送一个ACK,确认序号为收到序号+1,此时服务器进入CLOSED状态,四次挥手结束
常见面试题
为何创建链接是三次握手,挥手确要四次呢?
服务器在LISTEN状态下,收到创建链接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。关闭链接时,当收到对方的FIN报文时,仅仅表示对方再也不发送数据了可是还能接收数据,
己方也不必定把所有数据发送给对方。因此己方能够当即CLOSE,也能够发送一些数据给后,再发送FIN报文给对方来表示赞成关闭链接。己方ACK和FIN通常分开发送服务器