TCP协议:
位于传输层, 提供可靠的字节流服务。所谓的字节流服务(Byte Stream Service) 是指, 为了方便传输, 将大块数据分割成以报文段(segment) 为单位的数据包进行管理。 而可靠的传输服务是指, 能够把数据准确可靠地传给对方。 即TCP 协议为了更容易传送大数据才把数据分割, 而且 TCP 协议能够确认数据最终是否送达到对方。所以,TCP连接相当于两根管道(一个用于服务器到客户端,一个用于客户端到服务器),管道里面数据传输是通过字节码传输,传输是有序的,每个字节都是一个一个来传输。
tcp三次握手与四次挥手详解以及tcp相关知识点
本文经过借鉴书籍资料、他人博客总结出的知识点
tcp四次挥手图解
tcp三次握手过程
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT
状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送
一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1
),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完
成三次握手。
TCP四次挥手
1.客户端进程发出连接释放报文,并且停止发送数据。FIN=1。客户端进入
FIN-WAIT-1(终止等待1)状态。
2.服务器收到连接释放报文,发出确认报文,此时,服务端就进入了CLOSE-WAIT
(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放
了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数
据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态 持续的时间。
3.客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2) 状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数
据)。
4. 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,此时,服务器就
进入了LAST-ACK(最后确认)状态,等待客户端的确认。
5.客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,客户端就进入了
TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL
(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
6.服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后
,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一
些。
深入理解TCP连接
由于TCP是全双工的,因此在每一个方向都必须单独关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个FIN只意味着这个方向上没有数据流动,一个TCP连接在接收到一个FIN后仍能发送数据。 首先进行关
闭的一方将执行主动关闭,而另一方执行被动关闭。
TCP协议的连接是全双工连接,一个TCP连接存在双向的读写通道。简单来说,是“先关读,再关写” ,总共需要4个阶段。以客户机发起关闭连接为例:1.服务器读通道关闭;2.客户端写通道关闭;3.客户端读通道关闭;4.服务器写通道关闭。
关闭行为是在发起方数据发送完毕之后,给对方发出一个FIN(finish)数据段,直到接收到对方发送的FIN,且对方收到了接收确认的ACK之后,双方的数据通信完全结束,过程中每次都需要返回确认数据段ACK。
SYN攻击原理
SYN攻击属于DOS攻击的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,
耗费CPU和内存资源。SYN攻击除了能影响主机外,还可以危害路由器、防火墙等网
络系统,事实上SYN攻击并不管目标是什么系统,只要这些系统打开TCP服务就可以
实施。从上图可看到,服务器接收到连接请求(syn=j),将此信息加入未连接队列,
并发送请求包给客户(syn=k,ack=j+1),此时进入SYN_RECV状态。当服务器未收
到客户端的确认包时,重发请求包,一直到超时,才将此条目从未连接队列删除。配
合IP欺骗,SYN攻击能达到很好的效果,通常,客户端在短时间内伪造大量不存在的
IP地址,向服务器不断地发送syn包,服务器回复确认包,并等待客户的确认,由于源
地址是不存在的,
服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常
的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。
“三次握手”的目的是为了解决“网络中存在延迟的重复分组”的问题
client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了
,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文
段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的
连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,
那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的
请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运
输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉
了。
为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报
文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当
Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个
ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报
文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。
为什么不能用两次握手进行连接?
答:3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。
现在把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发 送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。
如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
TCP超时重传
原理是在发送某一个数据以后就开启一个计时器,在一定时间内如果没有得到发送的数据报的ACK报文,那么就重新发送数据,直到发送成功为止。影响超时重传机制协 议效率的一个关键参数是重传超时时间(RTO,Retransmission TimeOut)。RTO的 值被设置过大过小都会对协议造成不利影响。
(1)RTO设长了,重发就慢,没有效率,性能差。
(2)RTO设短了,重发的就快,会增加网络拥塞,导致更多的超时,更多的超时 导致更多的重发。 连接往返时间(RTT,Round Trip Time),指发送端从发送TCP包开始到接收它的立即响应所消耗的时间。
UDP协议:
无连接协议,也称透明协议,也位于传输层。
两者区别:
1) TCP提供面向连接的传输,通信前要先建立连接(三次握手机制); UDP提供无连接的传输,通信前不需要建立连接。
2) TCP提供可靠的传输(有序,无差错,不丢失,不重复); UDP提供不可靠的传输。
3) TCP面向字节流的传输,因此它能将信息分割成组,并在接收端将其重组; UDP是面向数据报的传输,没有分组开销。
4) TCP提供拥塞控制和流量控制机制; UDP不提供拥塞控制和流量控制机制。
长连接和短连接
HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。 IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠地传递数据包,使得网络上接收端收到发送端所发出的所有包,并且顺序与发送顺序一致。TCP协议是可靠的、面向连接的。
在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话。
而从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这行代码:
Connection:keep-alive
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。
HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接