教育培训类网站建设,课题组网站建设,typecho 抄wordpress,购物网站设计目的文章目录 (1) 三次握手各状态CLOSE状态SYN_SENT状态SYN_RECV状态ESTABLISHED状态 (2) 为什么握手时的seqnum是随机值#xff0c;以及acknum的功能(3) 三次握手中的半连接队列#xff08;SYN队列#xff09;和全连接队列#xff08;ACCEPT队列#xff09;半连接队列全连接队… 文章目录 (1) 三次握手各状态CLOSE状态SYN_SENT状态SYN_RECV状态ESTABLISHED状态 (2) 为什么握手时的seqnum是随机值以及acknum的功能(3) 三次握手中的半连接队列SYN队列和全连接队列ACCEPT队列半连接队列全连接队列 (4) 怎么缓解SYN泛洪(5) TCP实现P2P(6) 为什么需要三次握手 (1) 三次握手各状态
CLOSE状态
发起连接和listen之前的初始状态
SYN_SENT状态
第一次握手客户端向服务器发起连接请求发送一个SYN数据包该数据包中包含了客户端的初始序列号等信息用于请求与服务器建立TCP连接 SYN_SENT 初始状态发送SYN报文后即进入到了SYN_SENT状态并等待服务端的发送三次握手中的第2个报文。
SYN_RECV状态
第二次握手服务器接着会向客户端发送一个SYNACK数据包这是对客户端SYN请求的响应。该数据包包含了服务器的初始序列号以及对客户端SYN包的确认信息表示服务器同意与客户端建立连接。 SYN_RCVD 这个状态表示LISTEN状体时接受到了SYN报文在正常情况下这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态
ESTABLISHED状态
第三次握手客户端收到服务器的SYNACK包后会 向服务器发送一个ACK数据包 用于确认收到了服务器的SYNACK包。这个ACK包标志着客户端和服务器之间的TCP连接已经基本建立成功此时连接处于ESTABLISHED状态。
当服务端收到收到ack包以后会进入ESTABLISHED状态。
(2) 为什么握手时的seqnum是随机值以及acknum的功能
在第一次握手的时候tcp包头部的Sequence number是一个随机值就算自己随便设置一个值后续的TCP连接也是可以正常运作的上图的seqnum 1234但是在第二次握手回复的TCP包中的acknum会比第一次握手的Sequence number多一acknum 1235这里的1235表示表示 1235以前的所有包都收到了作用保证了tcp包的不丢失不重复 包括第二次握手时服务端发出的seqnum也是随机值4567但是第三次握手时的acknum是seqnum14568 作用避免被抓包以后被别人知道之前发过多少个包
(3) 三次握手中的半连接队列SYN队列和全连接队列ACCEPT队列 半连接队列
当服务器收到客户端发送的 SYN 报文段时会创建一个半连接节点并放进半连接队列该节点记录了该连接的相关信息如客户端的 IP 地址、端口号等此时连接处于半连接状态
SYN队列的作用在服务器处理能力有限的情况下SYN 队列可以暂时缓存客户端的连接请求避免因为同时处理过多连接请求而导致系统崩溃。
全连接队列
服务器收到客户端的ACK包后会检查这个ACK包的合法性和有效性如确认序列号是否正确等。如果检查通过服务器会将对应的连接从SYN队列中取出并放入accept队列。Accept 队列用于存放已经完成三次握手的 TCP 连接此时应用程序就可以通过调用accept系统调用从accept队列中获取已经建立好的连接开始进行数据传输等操作。
Accept队列的作用 1Accept 队列将网络层已经建立好的连接与应用层的处理隔离开来。应用层可以按照自己的节奏从 Accept 队列中获取连接而不会受到网络层连接建立速度的直接影响。
2缓冲连接数据在应用程序暂时无法处理新连接时Accept 队列可以作为一个缓冲区域存储这些已经建立的连接避免连接因为等待处理时间过长而出现问题。
(4) 怎么缓解SYN泛洪
1net.ipv4.tcp_max_syn_backlog在 Linux 系统中该参数用于设置 SYN 队列的最大长度。默认值通常为 1024 或 2048可以根据服务器的性能和实际需求进行调整。 通过限制 SYN 队列的长度可以在一定程度上抵御 SYN Flood 攻击。当 SYN 队列已满时服务器会丢弃新的 SYN 请求从而避免被大量伪造的 SYN 报文淹没。
2somaxconn这是系统级别的参数用于限制 Accept 队列的最大长度。在不同的操作系统中默认值可能不同。例如在 Linux 中默认值通常为 128。 listen(int socketfd, int backlog)在网络编程中listen 函数的 backlog 参数用于设置服务器端监听套接字的 Accept 队列长度。它会覆盖系统默认的 somaxconn 值但通常不能超过 somaxconn。 当 Accept 队列已满时服务器会拒绝新的 SYN 请求从而避免服务器因处理大量的 SYN 请求而耗尽资源在一定程度上可以缓解 SYN 泛洪攻击对服务器造成的影响。
(5) TCP实现P2P P2P中没有客户端和服务端的概念
(6) 为什么需要三次握手
三次握手的主要目的是为了确认服务器端和客户端的发送和接受能力是否正常 第一次握手客户端发送网络包服务端收到了。 这样服务端就能得出结论客户端的发送能力、服务端的接收能力是正常的。 第二次握手服务端发包客户端收到了。 这样客户端就能得出结论服务端的接收、发送能力客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常。 第三次握手客户端发包服务端收到了。 这样服务端就能得出结论客户端的接收、发送能力正常服务器自己的发送、接收能力也正常。
假设只有两次握手。 当客户端发送第一个SYN但由于网络延迟或其他原因第一个SYN没有及时到达服务端于是客户端又发送一次SYN,这次的SYN成功到达了服务端在连接结束后第一个SYN终于到了服务端此时服务端以为客户端再次发起连接请求于是回复ACKSYN导致再次连接再次建立浪费资源