TCP/IP协议是一个协议簇,里面包括许多协议,UDP只是其中一个。
TCP/IP协议集包括应用层、传输层、网络层和网络访问层。
应用层协议包括
- 超文本传输协议(HTTP)万维网基本协议
- 文件传输协议(TFTP简单文件传输协议)
- 远程登录(Telnet)提供远程访问其它主机功能, 它允许用户登录internet主机,并在这台主机上执行命令;
- 网络管理(SNMP简单网络管理协议),该协议提供了监控网络设备的方法, 以及配置管理,统计信息收集,性能管理及安全管理等;
- 域名系统(DNS),该系统用于在internet中将域名及其公共广播的网络节点转换成IP地址。
网络层
- Internet协议(IP);
- Internet控制信息协议(ICMP);
- 地址解析协议(ARP);
- 反向地址解析协议(RARP)。
TCP 协议
传输控制协议,是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。
三次握手
指建立一个 TCP 连接时,需要客户端和服务器总共发送3个包
- 第一次握手(SYN=1, seq=x):
客户端发送一个 TCP 的 SYN 标志位置1的包,指明客户端打算连接的服务器的端口,以及初始序号 X,保存在包头的序列号(Sequence Number)字段里。
发送完毕后,客户端进入 SYN_SEND
状态。
- 第二次握手(SYN=1,ACK=1,seq=y,ACKnum = x+1)
服务器发回确认包(ACK)应答。即 SYN 标志位和 ACK 标志位均为1。服务器端选择自己 ISN 序列号,放到 Seq 域里,同时将确认序号(Acknowledgement Number)设置为客户的 ISN (包头序列号)加1,即X+1。
发送完毕后,服务器端进入 SYN_RCVD
状态。
- 第三次握手(ACK=1,ACKnum=y+1)
客户端再次发送确认包(ACK),SYN 标志位为0,ACK 标志位为1,并且把服务器发来 ACK 的序号字段+1,放在确定字段中发送给对方,并且在数据段放写ISN的+1
发送完毕后,客户端进入 ESTABLISHED
状态,当服务器端接收到这个包时,也进入 ESTABLISHED
状态,TCP 握手结束。
四次挥手
TCP 的连接的拆除需要发送四个包,因此称为四次挥手(Four-way handshake),也叫做改进的三次握手。客户端或服务器均可主动发起挥手动作,在 socket 编程中,任何一方执行 close() 操作即可产生挥手操作。
- 第一次挥手(FIN=1,seq=x)
假设客户端想要关闭连接,客户端发送一个 FIN 标志位置为1的包,表示自己已经没有数据可以发送了,但是仍然可以接受数据。
发送完毕后,客户端进入 FIN_WAIT_1
状态。
- 第二次挥手(ACK=1,ACKnum=x+1)
服务器端确认客户端的 FIN 包,发送一个确认包,表明自己接受到了客户端关闭连接的请求,但还没有准备好关闭连接。
发送完毕后,服务器端进入 CLOSE_WAIT
状态,客户端接收到这个确认包之后,进入 FIN_WAIT_2
状态,等待服务器端关闭连接。
- 第三次挥手(FIN=1,seq=y)
服务器端准备好关闭连接时,向客户端发送结束连接请求,FIN 置为1。
发送完毕后,服务器端进入 LAST_ACK
状态,等待来自客户端的最后一个ACK。
第四次挥手(ACK=1,ACKnum=y+1)
客户端接收到来自服务器端的关闭请求,发送一个确认包,并进入 TIME_WAIT状态,等待可能出现的要求重传的 ACK 包。
服务器端接收到这个确认包之后,关闭连接,进入 CLOSED
状态。
客户端等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的 ACK ,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入 CLOSED 状态。
SYN攻击
在三次握手中,第二次握手结束之后,即客户端接收到(ACK=1,ACKnum=x+1)后,服务端进入(半连接)SYN_RCVD
状态。
SYN攻击是指,攻击客户端在短时间内伪造大量的不存在IP地址,不断向服务端发送SYN包(第一次握手)后,服务端返回,进入半连接状态。由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,导致目标系统运行缓慢,严重者会引起网络堵塞甚至系统瘫痪。
检测SYN攻击
当服务端看到大量半连接状态,特别是源IP地址是随机的,就基本可判断为遭受到SYN攻击。
防御SYN攻击
SYN攻击是无法阻止的,因为TCP三次握手就是这样的逻辑。但有以下方法可以防御SYN攻击。
- 缩短超时(SYN Timeout)时间
- 增加最大半连接数
- 过滤网关防护
- SYN cookies技术
TCP KeepAlive
TCP KeepAlive 的基本原理是,隔一段时间给连接对端发送一个探测包,如果收到对方回应的 ACK,则认为连接还是存活的,在超过一定重试次数之后还是没有收到对方的回应,则丢弃该 TCP 连接。
UDP协议
UDP 是一个简单的传输层协议。和 TCP 相比,UDP 有下面几个显著特性:
- UDP 缺乏可靠性。UDP 本身不提供确认,序列号,超时重传等机制。UDP 数据报可能在网络中被复制,被重新排序。即 UDP 不保证数据报会到达其最终目的地,也不保证各个数据报的先后顺序,也不保证每个数据报只到达一次
- UDP 数据报是有长度的。每个 UDP 数据报都有长度,如果一个数据报正确地到达目的地,那么该数据报的长度将随数据一起传递给接收方。而 TCP 是一个字节流协议,没有任何(协议上的)记录边界。
- UDP 是无连接的。UDP 客户和服务器之前不必存在长期的关系。UDP 发送数据报之前也不需要经过握手创建连接的过程。
- UDP 支持多播和广播。(TCP不支持)