SYN 同步 有效数值1
ACK 应答 1
FIN 结束 1
RST 重设
URG 紧急
PSH 强迫送出
1.建立TCP连接 通过3次握手实现
假设B客户机现在要和A主机通信
B->SYN->A. 当B客户机要和A主机通信,B首先发送一个SYN标记的包,告诉A请求建立连接.只有当A收到B发来的SYN包,才可以建立连接,除此之外没有其他的方法,因此,如果你的防火墙丢弃所有的发往外网接口的SYN包,那么你就不能让外网的主机连接你的机器.
A->SYN/ACK->B 接着,A收到B刚才发送过来的SYN包后,会发送一个SYN包的确认包,表示确认刚才B发送的包,然后继续,
B->ACK->A B收到A的SYN确认包后,B发送一个ACK确认包,通知A建立连接,一次TCP连接就建立成了,然后就可以通信,通信就是说,可以进行FTP,或者SSH,或者TELNET.
当主机在通信时,TCP的每个包都会设置ACK位,也就是连接跟踪,为什么要设置连接跟踪呢?如果没有连接跟踪,那么防火墙将无法判断收到的ACK是否属于一个已经建立的连接,后果可想而知,但是也不需要大家担心,正常的通信不存在这些问题.
2.结束通信,通过4次握手实现
刚才B客户和A服务器建立了连接,并进行了通信,现在通信完毕要关闭这个连接,由于TCP连接是双向连接,因此关闭连接要在两边都要实行,
B->ACK/FIN->B 当B要和A结束通信时,B先发送一个FIN标记的包,告诉A请求连接结束.但是现在双方还在通信,所以每个包都带有ACK标记,
A->ACK->B A发送一个ACK包给B,表示确认,
A->ACK/FIN->B 当完成数据传输后,就送出ACK/FIN包.
B->ACK->A B送出确认包给A,连接关闭,关闭连接不是我们关心的事情,那些事情是操作系统所要做的,就象现在写的任何软件,他们都是使用了系统调用.
关于关闭连接,不是只有上边我说的一种方法,还有一种就是发送RST包,RST包不需要对方进行确认,也就是说我不想和你连接了,就象现在说的:"单方面终止合同"。
今天在抓包分析的时候遇到了一个问题,当我打开网页时,会看到TCP三次握手的过程,但是当我把浏览器关闭之后,也就是说会话结束,并没有看到FIN数据包的发送。经过和师兄探讨,发现这个浏览器的具体实现有关,firefox关闭之后,其实主机和服务器的tcp连接还在,因为服务器端有超时机制,一旦超过一定的时间,客户端没有任何的响应,那么服务器端主动发送FIN包请求客户端断开连接,接着就是正常的tcp断开连接的过程。如果是IE,我用的是IE6,当关闭浏览器之后,浏览器在关闭之前会主动发送几个rst包给服务端,表示主动断开连接,这种断开连接的方式就是非正常断开。服务器收到这个rst包之后,直接关闭连接。
TCP连接的建立和结束
![](https://img-home.csdnimg.cn/images/20240711042549.png)