1. TCP 和 UDP
1.1 TCP的优点
可靠、稳定。TCP的可靠性建立在3次握手来建立连接,在数据传递时有确认、窗口、重传、拥塞控制机制,在数据传输完成后还会断开连接来节约系统资源
1.2 TCP的缺点
速度慢、效率低、占用系统资源高、不安全。TCP在传输数据之前要先建立连接 这会消耗时间,在数据传送时:确认机制,重传机制,拥塞控制机制都会消耗大量的时间,而且要在每台设备上维护所有的传输连接,事实上。每个连接都会占用系统的CPU 内存等硬件资源。因为TCP有确认机制、三次握手机制,这些也导致TCP容易被人利用,实现DOS、DDOS、CC等攻击。
1.3 TCP/IP报文格式详解
-
端口号
用来标记同一系统上的不同进程
- **源端口:**占2个字节,源端口和IP的作用是标记报文的返回地址
- 目的端口: 占2个字节,指接收方计算机应用程序(进程)的端口号
TCP源端口号+TCP目的端口号+源IP+目的IP确定唯一的一条TCP连接
-
**序号(SEQ):**站4字节 是TCP可靠传输的关键部分,是本报文段发送数据组的第一个字节的序号,
例如: 一个报文段的序号为100,报文数据公有100个字节 那下一个报文段的序号则为200,所以序号确保了数据传输的有序性
-
**确认序号(ACK):**占4字节指明下一个期望收到的字节序号,表明之前的序号正确无误的收到确认号,确认号只有ACK=1时才有效,比如建立连接时SYN的ACK的标志位为0
-
**数据偏移:**占4位,表示指TCP的报文数据举例报头的起始位置的距离有多远
因为首部有可选内容,所以报文头的长度是不确定的,TCP报文长度最短字节为20字节,4位首部长度字段所能表示的最大值为1111,转化为10进制为15,故报头最大长度为15*32/8=60个字节。首部长度也叫数据偏移。
TCP报文头长度最小长度:
名称 数据大小 源端口号 2字节 目的端口号 2字节 序号 4字节 确认序号 4字节 首部长度 4位 标志位 12位 窗口大小 2字节 校验和 2字节 紧急指针 2字节 总和 20字节 -
**保留:**为将来定义新的用途保留,一般置为0
-
控制位:
- CWR:拥塞窗口减少标志,用来表示它接收到了设置ECE标志的TCP包,发送方收到消息后,通过减小滑动窗口来降低发送速率
- ECE: 用来TCP在三次握手时表名一个ECN功能的,在数据传输过程中,他用来表示接收到的TCP包的IP头部的ECN被设置为11,即网络线路拥堵。
- URG:紧急指针标志,1:表示紧急指针有效、0:表示紧急指针无效
- ACK:确认序号标志, 1:确认号有效、0:忽略确认号段
- PSH:push标志,表示接收方在接收到报文应尽快交给应用程序来处理,而不是放置在缓冲区排队
- RST:重置连接标志:用于重置 由于主机崩溃或者由于其他特殊原因导致出现错误连接。或者用于非法报文段和拒绝连接请求
- SYN:同步序号 用于建立连接过程。在请求过程中SYN=1和ACK=0表示该段数据没有使用捎带的作用域,而连接应答捎带一个确认即SYN=1&ACK=1
- FIN:结束标志。用于释放连接为1表示发送方已经没有数据发送了,即关闭接收方(本方)数据流
-
窗口: 滑动窗口大小,用来告诉发送端接收端的缓存大小,一次来控制发送端发送数据的速率从而达到流量控制 窗口大小为2个字节,所以窗口最大值65536
-
**校验和:**奇偶校验,次校验是针对整个TCP报文段的 包括报文头和报文数据以2个字节进行计算所得,次计算由发送端进行计算和储存,接收端进行校验
-
**紧急指针:**只有URG的值为1时生效,紧急指针是一个正偏移量和顺序字段中的值相加表示紧急数据的最后字节的序号,TPC的紧急方式是发送端向另一端发送紧急数据时的方式
-
选项和填充: 做常见的字段是最长报文大小,每个连接方通常都在第一个报文段(第一次握手,SYN=1)时,指明这个选项,表示本段能承受最大的报文段,选项长度不一定是32位的整数倍,所以要加填充位以保证TCP的头部是32的整数倍
1.4 TCP三次握手流程
-
第一次握手:发送端向接收端发送SYN报文 ,并且发送端的当前TCP连接状态变为 SYN_SENT
SEQ=x SYN=1
-
第二次握手:分两个步骤 此时接收端的状态变为SYN_RECV
- 第一步:接收端收到客户端的请求,向发送端回复确认信息
- 第二步:接收端想发送端发送一个SYN包(SEQ=y)建立连接的请求
-
第三次握手:发送确认包ACK
1.5 洪水攻击(SYN攻击)
洪水攻击: 我们都清楚建立TCP连接是需要三次握手的,但是当服务端对客户端进行第二次握手之后,客户端不对服务端进行第三次握手,就会导致服务端的这个TCP链接一直处于SYN_SENT的状态,这是TCP的重试机制开始发挥作用了 系统默认为重试5次,每次大约30s左右 即单个无效TCP连接存在网络150s,如果当大量(十万、百万级)的TCP链接处于SYN_SENT的状态 这回导致服务端的网络阻塞 CPU和内存也会有很高的占用。这就是常见的洪水攻击的基本原理。
治理方案:将系统默认的五次重试改为0次,即 当第三次握手没有收到,即丢弃当前TCP连接,可能会影响到网络不好的用户,但是问题不大。
1.6 UDP的优点
快,比TCP稍安全 UDP没有TCP的握手、确认、窗口、重传、拥塞控制等机制,UDP是一个无状态的传输协议,所以它在传递数据时非常快。没有TCP的这些机制,UDP较TCP被攻击者利用的漏洞就要少一些。但UDP也是无法避免攻击的,比如:UDP Flood攻击……
1.7 UDP的缺点
不可靠,不稳定 因为UDP没有TCP那些可靠的机制,在数据传递时,如果网络质量不好,就会很容易丢包。 基于上面的优缺点,那么: 什么时候应该使用TCP: 当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。 在日常生活中,常见使用TCP协议的应用如下: 浏览器,用的HTTP FlashFXP,用的FTP Outlook,用的POP、SMTP Putty,用的Telnet、SSH QQ文件传输 ………… 什么时候应该使用UDP: 当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用UDP。 比如,日常生活中,常见使用UDP协议的应用如下: QQ语音 QQ视频 TFTP ……
- 源端口号:数据发送方的端口号
- 目的端口号:数据接收方的端口号
- UDP长度:UDP报文的字节长度包括头部和数据
- UDP校验和:校验UDP首部和数据部分的正确性