TCP三次握手和四次挥手总结

TCP我来了→_→*


1、TCP的连接建立——三次握手


最初两端的TCP进程都处于CLOSED(关闭)状态。客户端主动打开连接,服务器被动打开连接

服务器进程创建传输控制块TCB(Transmission Control Block),然后处于LISTEN(收听)状态,准备接受客户端的连接请求**

客户端进程也创建传输控制块TCB,向服务器发出连接请求报文段,此报文段中同步位SYN=1,且选择一个初始序号seq=x。TCP规定,SYN=1的报文段不能携带数据,但要消耗一个序号。此时A进入SYN-SENT(同步已发送)状态。

服务器收到连接请求报文后,如果同意建立连接,则向客户端发送确认报文段,此报文段中SYN=1,确认位ACK=1,确认号为ack=x+1,同时选择一个初始序号seq=y。此报文段也不能携带数据,但同样要消耗一个序号。此时B进入SYN-RCVD(同步收到)状态。

客户端收到服务器的确认报文段后,还要向服务器发送确认报文段。此报文段中ACK=1,ack=y+1,seq=x+1。TCP规定ACK报文段可以携带数据,但如果不携带数据则不消耗序号,所以下一个数据报文段的序号仍是seq=x+1。此时A进入ESTABLISHED(以建立连接)状态

当服务器收到客户端的确认后,也进入ESTABLISHED(以建立连接)状态。

2、为什么TCP握手需要三次?

tcp是可靠的传输控制协议,三次握手能保证数据可靠传输又能提高传输效率。

如果tcp的握手是两次:

《1》如果client向server发送的第一条请求连接报文段由于网络原因,延迟发送。由于client没有接收到server对SYN的确认报文段,会重发SYN报文。server回复ACK,建立连接。数据发送完毕,这条连接正常关闭。这时,延迟的SYN报文发送到server,服务器误认为这是client重新发送的同步报文,又回复了一个ACK,和客户端建立了连接。

《2》如果server给client发送的ACK报文,由于网络原因,报文被丢弃,但server认为已经建立好连接,但是client没有收到server发来的确认报文,认为没有建立好连接。client会重新发送SYN报文,此时server已经处于ESTABLISHED状态,认为已经建立好连接。

《3》如果client向server发送了第一条请求连接报文段,但发送过后client由于程序关闭或超时导致直接关闭,但server收到了客户端发来的请求,并回复ACK报文,建立连接。这样会浪费服务器的资源。

如果TCP的连接是四次:

1.client给server发送SYN同步报文; 
2.server收到SYN后,给client回复ACK确认报文; 
3.server给client发送SYN同步报文; 
4.client给server发送ACK确认报文。 
第2.3步之间,server和client没有任何的数据交互,分开发送相当于多发了一次TCP报文段,SYN和ACK标识只是TCP报头的一个标识位。很明显,这两步可以合并,从而提高连接的速度和效率。


3、TCP连接的关闭———四次挥手


客户端向服务器发送连接释放报文段并停止发送数据。此报文段中终止控制位FIN=1,seq=u(等于前面已传送过的数据的最后一个字节加1)。此时A进入FIN-WAIT-1(终止等待1)状态。TCP规定,FIN报文段即使不携带数据也要消耗一个序号。

服务器收到连接释放报文段后就发出确认报文段。此报文段中确认号ack=u+1,seq=v(等于前面已传送过的数据的最后一个字节加1)。此时服务器进入CLOSE-WAIT(关闭等待)状态。TCP服务器进程通知应用进程,客户端到服务器的连接释放了,这时的TCP连接处于半关闭(half-close)状态,但服务器到客户端的连接并未关闭,此时服务器发数据,客户端仍要接收。

客户端收到服务器的确认后,就进入FIN-WAIT2(终止等待2)状态,等待服务器发出的连接释放报文段

如果服务器已没有要发送的数据,就发送连接释放报文段。此报文段中FIN=1,seq=w(在半关闭状态中B可能发送了数据),ack=u+1。此时服务器进入LAST-ACK(最后确认)状态

客户端收到了服务器的连接释放报文段后就发出确认报文段。此报文段中ACK=1,ack=w+1,seq=u+1。此时客户端进入TIME-WAIT(时间等待)状态

此时TCP连接还没有释放掉,必须经过时间等待计时器(TIME-WAIT timer)设置的2倍的最长报文段寿命MSL(Maximum Segment Lifetime)后,客户端才进入到CLOSED状态。MSL建议设为2分钟当客户端撤销相应的传输控制块TCB后,就结束了这次TCP连接

服务器收到客户端的确认报文,就进入CLOSED状态。服务器撤销相应的传输控制块TCB后,就结束了这次的TCP连接

4、为什么要设置TIME_WAIT状态?

(1)可靠的终止TCP连接。如果客户端向服务器发送的ACK报文由于网络原因被丢弃,此时服务器没有收到客户端发来的确认报文段就会重传FIN结束报文段,处于TIME_WAIT状态的客户端可以重新对服务器发送ACK确认报文段,释放连接。

(2)保证让迟来的TCP报文段有足够的时间被识别并丢弃。连接结束了,网络中的延迟报文段也应该被丢弃,经过2MSL后,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失,避免影响立刻新建立的连接。

5、为什么是四次挥手?

TCP协议是全双工通信,这意味着客户端和服务器端都可以向彼此发送数据,所以关闭连接是双方都需要确认的共同行为。

如果是三次挥手:首先释放了客户端到服务器方向的连接,此时TCP连接处于半关闭(Half-Close)状态,这时客户端不能向服务器发送数据,而服务器还是可以向客户端发送数据。如果此时客户端收到了服务器的确认报文段后,就立即发送一个确认报文段,这会导致服务器向客户端还在发送数据时连接就被关闭。这样会导致客户端没有完整收到服务器所发的报文段。

6、TCP状态转移总图



粗虚线表示典型的服务器连接的状态转移图

粗实线表示典型的客户端连接的状态转移图

细线表示异常变迁

7、DOS攻击 

DOS攻击利用合理的服务请求占用过多的服务资源,使正常用户的请求无法得到相应。

常见的DOS攻击有计算机网络带宽攻击和连通性攻击

带宽攻击指以极大的通信量冲击网络,使得所有可用网络资源都被消耗殆尽,最后导致合法的用户请求无法通过。

连通性攻击指用大量的连接请求冲击计算机,使得所有可用的操作系统资源都被消耗殆尽,最终计算机无法再处理合法用户的请求。

SYN洪水攻击 
SYN
洪水攻击属于DOS攻击的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源。

客户端在短时间内伪造大量不存在的IP地址,向服务器不断地发送SYN报文,服务器回复ACK确认报文,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN报文被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。

死亡值ping

许多操作系统的TCP/IP协议栈规定ICMP包大小为64KB,且在对包的标题头进行读取之后,要根据该标题头里包含的信息来为有效载荷生成缓冲区。死亡值ping”就是故意产生畸形的测试ping包,声称自己的尺寸超过ICMP上限,也就是加载的尺寸超过64KB上限,使未采取保护措施的网络系统出现内存分配错误,导致TCP/IP协议栈崩溃,最终接收方宕机 

 


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值