TCP连接的建立于释放

连接的建立

TCP的连接是由三次握手来完成的。


客户端向服务器发起连接:

第一次握手,客户端向服务器发送TCP包,SYN标志位置1,初始序号Seq=x。

第二次握手,服务器向客户端发送确认包ACK应答,ACK值为x+1(一个SYN占用一个序号),同时这个应答包SYN为置1,向客户机发送连接请求,初始序号Seq=y。

第三次握手,客户端向服务器发送连接确认ACK应答包。ACK值为y+1。在这个确认包中,可以发送数据了。

那么TCP连接建立为什么要三次握手?

TCP是一个全双工的通信协议,假设通信双方为A和B,A向B发送请求,建立A到B的连接后,并不能保证B到A的连接能建立。

如果改为两次握手,假设A向B发送连接请求,但是由于某些原因,发送连接请求没有到达B;A又发送了一个连接请求,这时B收到了,发送确认建立了连接,通信结束后断开。这时A第一次发送丢失的连接又到达了B,B发送确认后以为建立了连接。

那么如果A和B同时向对方发送连接请求,又是怎样的呢?


这时将会由四次握手来建立连接。没有客户端/服务器的区别,每一方既是客户端又是服务器。


TCP三次握手来建立连接,在服务器收到连接请求发送SYN-ACK后,在收到客户端ACK 前是初始半连接状态(SYN_RCVD),但是这时服务器已经为连接预留了资源;由于客户端的SYN源IP一般不存在,服务器超时重发SYN-ACK,这时伪造的SYN包长时间占用未连接队列,导致一些正常的SYN连接请求被丢弃,引起网络堵塞。


连接的释放

因为TCP连接时一个全双工的连接,所以每个方向必须单独关闭。

首先进行关闭的一方执行主动关闭,发送FIN,另一方收到FIN后执行被动关闭,发送一个ACk确认,确认报文段序列号为收到序列号加1,一个FIN将占用一个序列号。这样就关闭了一个方向上的TCP链接。另一个TCP方向上的连接也需要2次这样的挥手,所以为四次挥手。

最后要说明一下2MSL等待时间。档被动关闭方向主动关闭方发送FIN报文段,主动关闭方发送ACK确认后并不是理解关闭TCP连接,而是要经过一个2MSL的等待。因为主动关闭方的ACK确认可能丢失,如果立即关闭,被动方以为主动方还没有收到,将会超时重发。经过2MSL的等待时间,可以确保即使被动方重发FIN报文,主动方也可以收到。
 
附TCP状态变迁图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值