三次握手
TCP如何保证可靠传输
- 数据报校验
- 超时重传机制
- 应答机制
- 对失序数据包重排序
- TPC还能提供流量控制
三次握手

三次握手过程
- 第一次握手:client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给server,client进入SYN_SENT状态,等待server确认。
- 第二次握手:server收到数据包后由标志位SYN=1知道client请求连接,server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值sep=K,并将该数据包发送给client以确认连接请求,server进入SYN_RCVD状态。
- 第三次握手:client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则连接建立成功,client和server进入established状态,完成三次握手,随后client和server之间可以开始传输数据了。
三次握手原因
为了防止失效的链接请求报文突然又传到了服务端,因而产生错误。例如:“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文并没有丢失,而是在某个网络节点长时间滞留,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。当server却以为新的运输连接已经建立,并一直等待client发来数据。这样,sever的很多资源就白白浪费了。采用三次握手可以防止上述现象的发生。例如刚才那种情况,client不会向server发出确认。server由于收不到确认,就知道client并没有要求建立连接。
通过三次握手可以确认客户端和服务器端的收发功能是否正常。client确认了:自己发送、接收正常,对方发送、接收正常;server确认了:自己发送、接收正常,对方发送、接收正常。
DDos攻击
client不断向sever发送请求,server会给每个请求创建一个连接,然后向client发送创建链接时的回复,然后进行等待客户端发送第三次握手数据包。DDos攻击就是这样的原理,第一个D表示的是分布式distribute。让server产生大量的等待client回复的连接,浪费系统资源,并且会使正常的请求进不来。
简单说服务器发送连接请求,首先:
- 客户端向服务器端发送连接请求的数据包(第一次握手)。
- 服务器向客户端回复连接请求数据包(第二次握手)。然后服务器等待客户端发送tcp/ip连接的第三步数据包(第三次握手)。
- 如果客户端不向服务器端发送最后一个数据包,则服务器必须等待30s-2min才能将此连接关闭。当大量的请求只进行到了第二步,而不进行第三步,服务器又有大量资源在等待第三个数据包。最后就造成了DDos攻击。
预防ddos攻击(没有根治办法,除非不用tcp/ip)
- 确保服务器的系统文件是最新版本,并及时更新系统补丁
- 关闭不必要的服务
- 限制同时打开SYN的半连接数目
- 缩短SYN半连接的time out时间
- 正确设置防火墙
- 禁止对主机的非开放服务访问
- 限制特点IP短地址的访问
- 启用防火墙防DDos的属性
- 严格限制对外开放的服务器的向外扫描
- 运行端口映射程序或端口扫描程序,要认真检查特权端口和非特权端口。
- 认真检查网络设备和主机/服务器系统的日志。只要日志出现漏洞或是时间变更,那这台机器就可能遭到了攻击。
- 限制在防火墙外与网络文件共享,这样会给黑客截取系统文件的机会,主机的信息会暴露给黑客,无意给了对方入侵的机会。
四次挥手

四次挥手过程
由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。
- 第一次挥手:client发送一个FIN,用来关闭client到server的数据发送,client进入FIN_WAIT_1状态。
- 第二次挥手:server收到FIN后,发送一个ACK给client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号,server进入CLOSE_WAIT)。
- 第三次挥手:server发送一个FIN,用来关闭server到client的数据传送,server进入LAST_ACK状态。
- 第四次挥手:client收到FIN后,client进入TIME_WAIT状态,接着发送一个ACK给server,确认序号为收到序号+1,server进入CLOSED状态,完成四次挥手。
四次挥手的原因
TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。
为什么建立连接是三次握手,而关闭连接却是四次挥手
这是因为服务器端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,收到对方的FIN报文时,仅仅表示对方不在发送数据了但是还能接受数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。
TCP和UDP
- UDP是无连接的,即发送数据之前不需要建立连接。
- UDP使用尽最大努力交付,即不保证可靠交付,同时也不使用拥塞控制。
- UDP是面向报文的,UDP没有拥塞控制,很合适多媒体通信的要求。
- UDP支持一对一,一对多,多对一和多对多的交互通信。
- UDP的首部开销小,只有8个字节。
- TCP是面向连接的运输层协议。每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的(一对一)。
- TCP提供可靠交付的服务。
- TCP提供全双工通信。
- TCP面向字节流。
- 首部最低20个字节。