SYN是该协议中的一个标志位。如果该位被置为1,则表示这个报文是一个请求建立连接的报文。
ACK也是该协议的一个标志位。如果该位被置为1,则表示这个报文是一个用于确认收到数据的报文。
seq是数据包本身的序列号。发送数据自然要使序列号加一,而带SYN和FIN的报文不携带数据但也消耗一个序列号。
ack:确认号,其值是想要收到的数据的序列号。
三次握手:
1.客户端发送带SYM的报文,告知自己随机生成的初始序列号(seq=x)。发完进入SYN_SEND状态.
2.服务器回传一个带SYM和ACK的报文,其中序列号seq=y,确认号ack=x+1,进入SYM_REV状态。
3.客户端发送带ACK的报文(ack=y+1),发完进入确认连接状态。
三次握手简单来说就是客户端发送请求,然后服务器确认请求,然后客户端确认服务器的确认请求。
三次握手是为了防止请求已失效的问题。
比如客户端发送请求,因为延迟没有收到应答,于是再次发送而成功连接,数据传输完毕连接关闭。而此时第一个请求到达
,而如果没有第三次握手的话服务器就会同意并建立连接,而客户端此时不再需要传数据了就不会反应这样就会浪费服务器
的时间,而需要第三次握手的话这次服务器没收到客户端的应答就不会建立连接,也就不会浪费时间。
四次挥手:
第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不 会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可 以接受数据。
第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。
第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。
第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。
第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不 会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可 以接受数据。
第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。
第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。
第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。
第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不 会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可 以接受数据。
第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。
第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。
第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。

连接建立阶段:
1.客户端发送带SYN的报文,序列号为随机的x。请求建立连接。
2.服务器段回传一个带SYN和ACK的报文,序列号为y,确认号为x+1。
3.客户端回传一个确认报文。这个报文传不传数据都可以,不传就不消耗序列号。
传输数据阶段:
1.客户端发送数据报文。
2.服务器回传确认包。这里只是确认收到,让客户端可以继续发送数据,并没回传数据。、
结束连接阶段:
1.客户端发送带FIN包宣布终止传输数据,序号为x+2.并且没收到数据回传前都要带着ACK以提醒发送放发送时的序列号。
2.服务器端回传确认收到FIN包。之后服务器会继续发送没发完的数据给客户端(图中应该是把数据都放在第三步中FIN报文里了),而客户端则等待服务器发完并给它发送带
FIN的报文。
3.服务器发送带FIN的报文,这个也报文可以带数据,序列号只消耗1。
4.客户端发送确认报文。连接断开。