TCP通信协议的连接与挥手

建立TCP通信连接需要经过三次握手。初始时服务器端处于监听状态,accept()处于阻塞状态,客户端请求连接服务端时,connect()刚刚调用并处于阻塞状态

第一次握手,客户端向服务端发送SYN、MSS,客户端处于SYN_SENT状态,服务端接收后将由Listen状态变为SYN_RCVD状态。

第二次握手,服务端向客户端发送一个SYN、MSS还有一个ASK(等于客户端发送的SYN+1),客户端接收SYN、MSS、ASK核对无误后将SYN-SENT状态改为ESTABLISHED状态。

第三次握手,客户端connect()返回不在处于阻塞状态,客户端向服务端发送ACK(等于服务端发送的SYN+1),服务端接收ACK核对无误之后,accept()从阻塞状态返回,同时read()阻塞,连接建立。

三次握手的原因:1、防止已过期的连接再次传到被连接的主机,比如:两次握手时,A(选好端口)发送连接信息到B延迟了,A再发B接收了从而建立连接,信息传送完之后断开连接,原先的请求信息又传到B,B认为建立连接,但A相应的端口已经断开

2、三次握手防止死锁:A发送连接请求信息到B,B认为建立连接再发送请求信息到A却丢失了,A不知道连接的各个信息不知道B已经准备好认为连接还未成功,将忽略B所发来的信息,造成死锁。


断开TCP连接需要经过四次挥手。通常是客户端主动断开,客户端应用程序调用close(fd)关闭套接字。

第一次挥手,客户端向服务端发送FIN,客户端处于FIN-WAIT-1状态,服务端接收FIN将会处于close-wait()状态同时read()return 0。

第二次挥手,服务端向客户端发送ACK(等于客户端发送FIN+1),客户端接收ACK后将处于FIN-WAIT-2状态,服务端关闭客户端描述符close(),将未发送完的数据丢掉。

次挥手,服务端向客户端发送FIN,此时服务端处于LAST-ACK状态,客户端接收FIN后将由FIN-WAIT-2状态变为TIME-WAIT状态。

次挥手客户端向服务端发送ACK(服务端FIN+1)服务器接收ACK后核对无误将LAST-ACK状态变为CLOSE状态,连接断开。

注:客户端处于TIME-WAIT状态要经历2个MSL时间才会将状态变为CLOSE,通常等待时间为60s。


TCP的11种状态

客户端独有1SYN_SENT 2FIN_WAIT1 3FIN_WAIT2 4CLOSING 5TIME_WAIT

服务端独有1LISTEN 2SYN_RCVD 3CLOSE_WAIT 4LAST_ACK 

共有1CLOSED 2ESTABLISHED

LISTEN :监听来自远方TCP端口的连接请求。

SYN-SENT :在发送连接请求后等待匹配的连接请求。

SYN-RECEIVED :在收到和发送一个连接请求后等待对连接请求的确认。

ESTABLISHED :代表一个打开的连接,数据可以传送给用户。

FIN-WAIT-1 :等待远程TCP的连接中断请求,或先前的连接中断请求的确认。

FIN-WAIT-2 :从远程TCP等待连接中断请求。

CLOSE-WAIT :等待从本地用户发来的连接中断请求。

CLOSING :等待远程TCP对连接中断的确认。

LAST-ACK :等待原来发向远程TCP的连接中断请求的确认。

TIME-WAIT :等待足够的时间以确保远程TCP接收到连接中断请求的确认。

CLOSED :没有任何连接状态。


CLOSING状态:客户端向服务端发送了FIN,却没有收到服务器的ACK,反而收到了服务端的FIN。这种情况发生在服务器向客户端发送的ACK丢包了。


TIME-WAIT:一端发起主动关闭时,并且已经收到对方的FIN,这时进入TIME-WAIT状态,TIME-WAIT的时间是2倍的MSL(最大生存时间),在TIME-WAIT状态连接实际已经断掉,但原端口还不能被新的连接使用。

TIME-WAIT原因:

1、防止回给对方FIN的ACK丢失,服务端并不会对ACK做确认,只能等待一段时间寄希望服务端已经收到,如果服务端没有收到对其发送的FIN的确认会再发送FIN,这样客户端就由机会再回一个ACK。2、防止上一次连接中迟到的数据包影响新的连接,在TIME-WAIT状态这些包会被丢弃。


TCP进站(Inbound)处理过程:正常情况下,TCP进站处理的过程。

  服务端处于监听状态,客户端用于建立连接请求的数据包(IP packet)按照TCP/IP协议堆栈组合成为TCP处理的分段(segment)

  分析报头信息TCP层接收到相应的TCPIP报头,将这些信息存储到内存中。

  检查TCP校验和(checksum)标准的校验和位于分段之中(Figure-2)。如果检验失败,不返回确认,该分段丢弃,并等待客户端进行重传。

  查找协议控制块(PCB{})TCP查找与该连接相关联的协议控制块。如果没有找到,TCP将该分段丢弃并返回RST(这就是TCP处理没有端口监听情况下的机制如果该协议控制块存在,但状态为关闭,服务端不调用connect()listen()。该分段丢弃,但不返回RST。客户端会尝试重新建立连接请求。

  建立新的socket当处于监听状态的socket收到该分段时,会建立一个子socket,同时还有socket{}tcpcb{}pcb{}建立。这时如果有错误发生,会通过标志位来拆除相应的socket和释放内存,TCP连接失败。如果缓存队列处于填满状态,TCP认为有错误发生,所有的后续连接请求会被拒绝。这里可以看出SYN Flood攻击是如何起作用的。

  丢弃如果该分段中的标志为RSTACK,或者没有SYN标志,则该分段丢弃。并释放相应的内存。

TCP/IP是很多的不同的协议组成,实际上是一个协议组,TCP用户数据报表协议(也称作TCP传输控制协议,Transport Control Protocol。可靠的主机到主机层协议。这里要先强调一下,传输控制协议是OSI网络的第四层的叫法,TCP传输控制协议是TCP/IP传输的6个基本协议的一种。两个TCP意思非相同。 )


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值