1:TCP考点
1:序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记
2:确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,不是1,就无效。ack=Seq+1。
3:ACK:标志位 为了来说明确认序号有效。
5:RST :复位,重置连接
6:SYN:发起一个新连接。同步字段,当SYN=1,表示这个是一个同步请求。
7: FIN 终止链接当FIN=1的时候,表明数据已经发送完毕,请求释放链接
确认序号ack与标志位中的ACK
三次握手
TCP链接使用的是客户端服务器方式
客户端 Client (主动端)发送数据
服务端 Server (开启端口) 主动监听
1:Client发送链接请求报文 SYN=1 seq=X (链接请求报文)
2:Server接受到了报文,由标志位SYN=1知道Client请求建立连接。然后发送SYN=1 并且ACK=1 使确认号ack=X+1(已经收到了X的序列号了,希望下一个是X+1的数据流),
同时自己发送一个seq=y。并将该数据包发送给Client以确认连接请求
3:Client接受到信息后,检查这个确认序号ack是否=X+1.标志位是否为1.再次发送ACK=1 然后ack=y+1 (表明接受到了y的数据流了,希望下一个是y+1) 同时seq=s+1
断开链接
分为2个部分 主动关闭方A的分离和被动关闭方B的分离
1:A 首先发送FIN=1 停止发送数据 seq=x 等待B的链接 。 进入FIN_WAIT_1状态。
2:B 收到信息后 标志位ACK=1 同时确认号 ack=X+1 自己再次发送这个seq=y。并将该数据包发送给A以确认连接请求。 进入CLOSE_WAIT状态。
此时 从A到B这个方向就释放了,但是TCP链接还是半关闭状态 ,B发送数据, A仍然要接受
3:B再次发送一个FIN =1 标志位ACK=1 seq=w ack=X+1
4:A 收到链接释放报文后,ack=w+1 seq=a+1
为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。