1、tcp特点
tcp是面向连接的、可靠的流协议。
tcp为提供可靠性传输,实行“顺序控制”或“重发控制”机制。此外还具备“流控制(流量控制)”,“拥塞控制”、提高网络利用率等众多功能。
在tcp中,当发送端的数据到达接收主机时,接收端主机会返回一个已收到消息通知。这个消息叫做确认应答(ack)
2、tcp 三次握手及原因
2.1 三次握手
- 第一次握手:client发送一个SYN(J)包给server,然后等待server的ACK回复,进入SYN-SENT状态。p.s: SYN为synchronize的缩写,ACK为acknowledgment的缩写。
- 第二次握手:server接收到SYN(seq=J)包后就返回一个ACK(J+1)包以及一个自己的SYN(K)包,然后等待client的ACK回复,server进入SYN-RECIVED状态。
- 第三次握手:client接收到server发回的ACK(J+1)包后,进入ESTABLISHED状态。然后根据server发来的SYN(K)包,返回给等待中的server一个ACK(K+1)包。等待中的server收到ACK回复,也把自己的状态设置为ESTABLISHED。到此TCP三次握手完成,client与server可以正常进行通信了。
2.2 ack
ack通常被理解为收到数据后给出的一个确认ACK,ACK包含两个非常重要的信息:
一是期望接收到的下一字节的序号n,该n代表接收方已经接收到了前n-1字节数据,此时如果接收方收到第n+1字节数据而不是第n字节数据,接收方是不会发送序号为n+2的ACK的。举个例子,假如接收端收到1-1024字节,它会发送一个确认号为1025的ACK,但是接下来收到的是2049-3072,它是不会发送确认号为3072的ACK,而依旧发送1025的ACK。
二是当前的窗口大小m,如此发送方在接收到ACK包含的这两个数据后就可以计算出还可以发送多少字节的数据给对方,假定当前发送方已发送到第x字节,则可以发送的字节数就是y=m-(x-n).这就是滑动窗口控制流量的基本原理
2.3 第三次握手失败处理方式
当失败时服务器并不会重传ack报文,而是直接发送RST报文段,进入CLOSED状态。这样做的目的是为了防止SYN洪泛攻击。
syn洪泛攻击
通俗的理解是:当第三次握手没有发送确认信息时,等待一段时间后,主机就会断开之前的半开连接并回收资源,这为dos(deny of service)攻击埋下隐患,当主动方主动发送大量的syn数据包,但并不做出第三次握手响应,server就会为这些syn包分配资源(但并未使用),就会使server占用大量内存,使server连接环境耗尽,这就是syn洪泛攻击
3、tcp滑动窗口
tcp以1个段为单位,每发一个段进行一次确认应答的处理,这样的传输方式有一个缺点。那就是,包的往返时间越长通信性能就越低。
确认应答不在是以每个分段,而是以更大的单位进行确认,转发时间会被大幅度缩短。也就是说,发送端主机在发送了一个段以后不必要一直等待确认应答,而是继续发送。
窗口大小就是指无需等待确认应答而可以继续发送数据的最大值。这个机制实现了使用大量的缓冲区,通过对多段同事进行确认应答的功能。为此,发送端主机在等到确认应答返回之前,必须在缓冲区中保留这部分数据。在欢动窗口以外的部分包括尚未发送的数据以及已经确认对端已收到的数据。当数据发送后若如期收到确认应答就可以不用再进行重发,此时数据就可以从缓存去清除。手袋确认应答的情况下,将窗口滑动到确认应答额序列号的位置。这样可以顺序地将多个段同事发送提高通信性能。这种机制也被称为滑动窗口控制。