TCP
1、TCP:(Transmission Control Protocol)传输控制协议,是一种面向连接的可靠协议,工作在传输层。
2、面向连接:指的是在发送数据之前,双方都要保证链路的畅通,而且双方都是可以发送数据的。
3、TCP协议的作用:就是用来保证面向连接。
4、报文格式以及每个字段的作用
-
S和D port表示源目端口
-
seq number表示序列号,TCP链接中传输的数据流中每个字节都编上一个序号。序号字段的值指的是本报文段所发送的数据的第一个字节的序号。
-
ack number确认号,是期望收到对方的下一个报文段的数据的第1个字节的序号;
-
header length首部长度,指的是TCP报文的数据距离TCP报文段的起始处有多远
-
resv服务质量,QOS中做流量标记使用
-
urg紧急指针字段,告诉系统此报文中有紧急数据
-
ack确认字段,当ack=1时,确认号字段才有效,用来表示TCP建立成功的状态
-
psh推送位,接收方应该尽快将这个报文段交给应用层,接收到PSH =
1的TCP报文段,应尽快的交付接收应用进程,而不再等待整个缓存都填满了后再向上交付。 -
rst复位,重建连接标识。当RST=1时,表明TCP连接中出现严重错误(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立连接。
-
syn在连接建立时用来同步序号。当SYN=1,ACK=0,表明是连接请求报文,若同意连接,则响应报文中应该使SYN=1,ACK=1;
-
fin用来释放连接。当FIN=1,表明此报文的发送方的数据已经发送完毕,并且要求释放;
-
窗口,通知接收方用多大的空间来接收数据 校验和,用来校验数据的完整性
-
紧急指针,指出本报文段中的紧急数据的字节数
-
选项,可变长,定义一些可选的参数
5、TCP连接的三次握手
第一次握手:客户端发送syn包请求服务器建立连接,并初始化seq=j,进入SYN_SENT状态,等待服务器确认;第二次握手:服务器收到syn包后,则将自己的ack位制为1表示同意建立,并发送确认号ack number=j+1进行确认,同时发送syn包请求和客户端建立连接,并初始化seq=k,进入syn_recv状态;
第三次握手:客户端收到syn和ack number后,向服务器进行确认发送ack number=k+1,此时客户端和服务器进入ESTABLSHED状态,完成握手。
6、未连接队列
在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于SYN_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。
7、TIME_WAIT状态存在的原因
- 可靠终止TCP连接。如果最后一个ACK报文因为网络原因被丢弃,此时server因为没有收到ACK而超时重传FIN报文,处于TIME_WAIT状态的client可以继续对FIN报文做回复,向server发送ACK报文。
- 保证让迟来的TCP报文段有足够的时间被识别和丢弃。连接结束了,网络中的延迟报文也应该被丢弃掉,以免影响立刻建立的新连接。
8、为什么需要三次握手?
因为TCP是可靠的传输控制协议,三次握手能保证数据的可靠传输又能提高传输效率。
-
两次握手
(1)客户端给服务器发送SYN由于网络延时,此时可能导致客户端没有收到syn确认报文,就会重复发送syn,服务器收到后就会回复ACK,连接建立,数据发送完毕,连接关闭。这是由于延迟的syn报文到服务器,服务器就会误认为客户端重新同步,又会给回复一个ack和客户端建立连接。
(2)服务器给客户端的ack由于网络原因丢弃,此时服务器认为已经建立好了连接,但是客户端没有收到ack报文,认为连接没有建立,此时客户端有将会发送syn重新建立连接,此时服务器认为连接已经建立。 -
四次握手
1)c给s发送SYN同步报文;
2)s收到c的SYN,回复ACK报文;
3)s给c发送SYN同步报文;
4)c收到s的SYN,回复ACK报文;
若是4次握手,在第二次和第三次之间没有任何数据的交互,分开发送反而多了一次建立,从而会降低速度和效率;
9、四次挥手
1>客户端发送FIN,初始化seq=j,用来断开客户端到服务器的连接
2>服务器收到FIN后,回复ACK,确认序号为j+1;
3>服务器关闭客户端的连接,给客户端发送FIN断开请求,初始化seq=k;
4>客户端收到FIN后,回复ACK确认序号为k+1
10、为什么连接的时候是三次握手,关闭的时候却是四次握手?
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,”你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
11、为什么是四次?
TCP是全双工的连接,必须两端同时关闭连接,连接才算真正关闭。
如果一方已经准备关闭写,但是它还可以读另一方发送的数据。发送给FIN结束报文给对方对方收到后,回复ACK报文。当这方也已经写完了准备关闭,发送FIN报文,对方回复ACK。两端都关闭,TCP连接正常关闭。
12、syn攻击
服务器端的资源分配是在二次握手时分配的,而客户端的资源是在完成三次握手时分配的,所以服务器容易受到SYN洪泛攻击,SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server则回复确认包,并等待Client确认,由于源地址不存在,因此Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪。
防御SYN攻击
- 减少超时时间
- SYN网关和SYN代理
- 增大半连接数
- SYNcookies技术
SCTP协议
1、SCTP:流控制传输协议,是一种可靠的传输协议,它在两个端点之间提供稳定、有序的数据传递服务。与TCP和UDP不同,SCTP有过多宿主和多流功能,这两种功能均可提高可用性。
2、SCTP实际上是一个面向连接的协议,但SCTP偶联的概念要比TCP的连接具有更广的概念,SCTP对TCP的缺陷进行了一些完善,使得信令传输具有更高的可靠性,SCTP的设计包括适当的拥塞控制、防止泛滥和伪装攻击、更优的实时性能和多归属性支持。
3、SCTP和TCP的区别
最大的区别就是SCTP可以连接多个宿主和支持多流。
- 多宿主:
这里的多宿主可以理解为,比如说电脑上有多个网卡,每个网卡都有对应的IP地址,当进行SCTP建立连接时,可以将多个网卡申明在一个组中,利用组和组建立SCTP连接,当组中的一个成员建立连接失败后,另一个网卡直接切换,不需要重新建立连接。
多宿主的优点:
-
备份,增加了稳定性
-
提高效率
-
多流
在tcp协议中支持的是多字节,而在SCTP中支持的是多字节,不同之处只是SCTP能够在一个联合中支持多流机制。一个联合中的所有流都是独立的,但均与该联合相关。
4、SCTP联合(可以理解为组)与流之间的关系
每个流都给定了一个流编号,它被编码到SCTP报文中,通过联合在网络上传送。多流非常重要,因为阻塞的流(例如等待重传的流会导致报文的丢失)不会影响同一联合中的其他流。这个问题统称为head-of-lineblocking(对头阻塞)。TCP很容易出现这类阻塞问题
5、SCTP自带DOS防御
当恶意客户机使用虚假的源地址来伪造一个IP报文时,TCP就会出现问题了,这会大量TCPSYN报文攻击服务器。服务器在接收SYN报文之前,要为连接分配资源,但是在大量产生SYN报文的情况下,最终会耗尽自己的资源,从而无法处理新的请求。这种情况就称为服务拒绝(DenialofService)(DoS)攻击。
SCTP可以通过一种4次握手的机制并引入cookie的概念来有效地防止这种攻击的产生。在SCTP中,客户机使用一个INIT报文发起一个连接。服务器使用一个INIT-ACK报文进行响应,其中就包括了cookie(标识这个连接的惟一上下文)。客户机然后就使用一个COOKIE-ECHO报文进行响应,其中包含了服务器所发送的cookie。现在,服务器要为这个连接分配资源,并通过向客户机发送一个COOKIE-ACK报文对其进行响应。
6、报文格式
7、四路连接
- 客户端发送INIT发起连接。
- 服务器收到后,利用INIT-ACK进行响应,其中包括ciikie值
- 客户端收到后,发起cookie-echo进行响应
- 服务器收到后,发送cookie-ack进行响应
8、三次断开类似TCP的三次握手
- 客户端发送shutdown断开请求
- 服务器收到后,回复shutdown-ack进行回复
- 客户端收到后,回复shutdown-completion断开完成
9、继承了UDP的特点
SCTP可以支持无需发送,每个流之间发送无需考虑顺序。