TCP报头
6位标志位 :
TCP通讯流程
三次握手
第一次握手:client端将报头的SYN标志位设置为1,产生一个序号值X,将X存入32位序号中,将该数据发送给server。
第二次握手:server端将报头的SYN标志位设位1,ACK的标志位设置为1,将X+1存入32位确认序号(表示X和X之前的数据都已经收到了,下次请求序号应该为X+1),如果server端也发送消息,就将其产生的序号值Y,存入32位序号,将该数据发送给client。
第三次握手:将ACK标志位设为1,将Y+1存入32位确认序号,将该数据发送给server。
连接建立
四次挥手
第一次挥手:将FIN标志位设为1,将序号值X存入32位序号(client端发送数据到序号X就结束了,且之后也不会在有数据),将该数据发送给server。
第二次挥手:将ACK标志位设为1,将序号值X+1存入32位确认序号,将该数据发送给client。
第三次挥手:将FIN将FIN标志位设为1,将序号值Y存入32位序号(server端发送的最后一个字节的序号为Y),将该数据发送给client。
第四次挥手:将ACK标志位设为1,将序号值Y+1存入32位确认序号,将该数据发送给server。
断开连接
为什么是三次握手 ?
第一次握手表明client端具有发送数据的能力,第二次握手表明server端具有接受数据和发送数据的能力,第三次握手表明client端具有接受数据的能力。
所以三次握手是可以验证client端和server端的接受和发送能力的最小握手次数。
如果只有一次握手,那么client端无法确认server端是否收到了消息,因此client端可能会多次发送报文。同样,如果只有两次握手,那么server端无法确认client端是否收到报文,从而使server端多次发送报文。(造成SYN洪水)
如果进行三次以上的握手就会造成资源的浪费。
为什么是四次挥手?
断开链接的本质:双方达成断开链接的共识
client:我要断开链接了
server:好的
//等到server处理完client最后的数据后
server:我要断开链接了
client:好的
如果不返回ACK信息,那么那么server/client端不知道对方是否收到了要断开链接的消息。只有返回ACk确保双方收到了消息,才能保证链接的安全性。
有无状态
协议的状态是指下一次传输数据的时候能考虑到这次传输信息的状态。 也有是说有状态协议以前的请求导致协议所处的状态会影响后续的状态,协议会根据上一个状态创建上下文。无状态服务是指把每个请求都作为与之前请求无关独立的事务来处理
因为TCP协议需要三次握手,所以TCP是有状态的协议。