三次握手:指建立一个TCP连接时,客户端和服务器之间需要发送3个包
- 主要作用就是为了确认双方通信能力是否正常,指定自己的初始化序列号
- 实质就是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换
TCP窗口大小
的信息
1.第一次握手
客户端发送一个SYN包给服务器(SYN=1建立连接),并进入SYN_SENT
状态,等待服务器确认;指明客户端的初始序列seq=x
首部的同步位SYN=1,初始序号seq=x,SYN=1的报文段不能携带数据,但要消耗掉一个序号。
2.第二次握手
服务器接收到SYN包,响应自己的SYN包,指明服务器端的初始化序列seq=y,同时ACK=x+1(客户端的初始序号+1)表明自己已经接收了客户端的SYN包,此时服务器处于SYN_RCVD
状态
在确认报文段中SYN=1,ACK=1,确认号ack=x+1,初始序号seq=y
3.第三次握手
客户端收到SYN包后,发送一个ACK包(ACK=y+1),即将服务器的初始序列+1作为ACK值,表示已经收到服务器的SYN包,此时客户端处于ESTABLISHED
状态;服务器端接收到ACK报文后,同样处于ESTABLISHED
状态;此时双方建立连接。
确认报文段ACK=1,确认号ack=y+1,序号seq=x+1(初始为seq=x,第二个报文段所以要+1),ACK报文段可以携带数据,不携带数据则不消耗序号
- 字段含义
URG 紧急指针是否有效。为1,表示某一位需要被优先处理
ACK 确认号是否有效,一般置为1。
PSH 提示接收端应用程序立即从TCP缓冲区把数据读走。
RST 对方要求重新建立连接,复位。
SYN 请求建立连接,并在其序列号的字段进行序列号的初始值设定。建立连接,设置为1
FIN 希望断开连接。
- 序列号seq:4个字节,标记数据端的顺序
- 确认号ack:4个字节,期待收到对方下一个报文段的第一个数据字节的序号
- 确认ACK:仅当ACK=1时,确认号ack有效
- 同步SYN:连接建立时用于同步序号。当SYN=1,ACK=0时表示:这是一个连接请求报文段;
- 终止FIN:释放一个连接