TCP报头
源端口号,目的端口号不用解释,传输层封装的
序号(sequence number):seq,用来标识表示数据的字节流在第几位开始
确认序号(acknowledge number):ack,表明数据被收到,并期望从从收到的下一位开始收取
URG:紧急标志位
ACK:确认标志位,如果置1,开始发送确认序号
RST:复位标志位
SYN:请求建立链接标志位
FIN:结束标志位
三次握手
1.首先,A请求与B建立链接,SYN置1,seq=x,设置发送包的序列号是x,第一次握手
2.B收到请求链接报文,向A也发送请求连接包(因为TCP是双向链接),SYN置1,ACK置1,表示确认应答以及收到了A的包,并Acknumber=X+1,表示下次想收到序列号从X+1开始的报文。设置发送包的序列号是y,第二次握手
3.A收到的B的包,包含了请求连接以及确认A->B的连接,A发出的包也将ACK置1,表示确认应答以及收到了B的包,并Acknumber=Y+1,表示下次想收到序列号从Y+1开始的报文。第三次握手
四次挥手
1.首先,A向B发送断开连接包,FIN为1,第一次挥手。
2.B回复同意,ACK=1表示确认,第二次挥手。
3.B发送断开连接包,FIN为1,第三次挥手。
4.A回复同意,ACK为1表示确认,第四次挥手。
问题:
1、为什么B不在一个包内把ACK、FIN同时置1
因为有可能B还在向A传送数据,还没有断开连接的需求,所以先不放到一个包里,也有在一个包里的情况
2、为什么A与B断开,A还能发送确认包
因为还没完全释放