装修设计案例网站,青岛关键词排名提升,免费网站下载大全,wordpress高仿dz模板一个TCP连接由4个元组组成#xff1a;2个ip地址和2个端口号tcp三次握手为什么是三次握手解决历史连接问题通过三次握手才能阻止重复历史连接的初始化通过三次握手#xff0c;才能对通讯双方的初始序号初始化如果只有2次握手#xff0c;发送方一旦发送创建连接的请求就无法撤…一个TCP连接由4个元组组成2个ip地址和2个端口号tcp三次握手为什么是三次握手解决历史连接问题通过三次握手才能阻止重复历史连接的初始化通过三次握手才能对通讯双方的初始序号初始化如果只有2次握手发送方一旦发送创建连接的请求就无法撤回如果网络环境较差发送方连续发送多次连接请求如果只有2次通信接收方只能接受或者拒绝请求且接收方不知道这个请求是不是历史请求。所以通过三次握手和引入RST机制接收方接到请求时会将发送方发来的seq1发送给对方此时由发送方来判断连接是否是历史连接如果是历史连接(seq过期或者超时)发送方会发送RST控制消息终止这次连接如果不是历史连接发送方发送ack完成连接的建立解决序号问题通信双方都需要获得一个用于发送信息的初始化序号需要向对方发送syn并携带自己的期望的初始化序号对方在收到后会回复ack以及seq1 来确认TCP 半关闭同时打开同时打开需要4次数据交换同时关闭初始化序号初始化序号会随时间的变化而变化每个连接拥有不同的初始化序号。一个TCP连接只有具备了4元组与当前窗口序号才会被对方认为是正确的建立连接超时TCP为了建立连接频繁以指数回退的方式的发送SYN报文段一些系统可以配置SYN的次数TCP 选项最大段大小选项指的是TCP协议允许的从对方收到的最大报文段。这是通信对方在发送数据时能够使用最大报文段最大段只记录了TCP数据的字节数不包括TCP和IP头部。当创建TCP连接时通信的每一方都要在SYN报文段的MSS选项中说明自己允许的最大段大小。在没有事先指明的情况下最大段默认大小为546字节任何主机都能处理至少576字节546 20 20字节的ip数据报选择确认选项由于ack采用累积TCP不能正确的确认之前已经接收之前已经收到的数据。如果发送方能够了解接收方当前的空洞它就能在报文丢失或者遗漏时更好的进行重传。 TCP 选择确认SACK提供了上述功能。通过接收SYNC(SYNCACK)报文段中的允许选择确认选项。使用SACK选项用来来描述这些乱序的数据。从而帮助对方有效的重传TCP最大传输单元发现最大传输单元两台主机之间路径的所有网络报文段中最大传输单元的最小值发现过程在一个连接建立时TCP使用对外接口的最大传输单元的最小值或者根据通讯对方的声明的最大段大小来选择发送方的最大段大小。路径最大传输单元不允许TCP发送方有超过另一方所声明的最大段大小的行为。如果对方没有指明最大段大小的数值发送方将假设使用默认的536字节。注意一条连接的两个方向上的最大段大小是不同的。一旦发送方的最大段大小选定了初值TCP通过这条连接发送的所有IPV4数据报都会对DF字段进行设置。如果收到PTB消息,TCP就会较少段的大小然后用修改过的段进行重传。如果PTB中包含了下一跳的推荐最大传输单元段大小可以设置为下一跳的最大传输单元减去IPV4(IPV6)与TCP头部的大小。如果不包含最大传输单元发现和需要尝试多次由于路由是动态变化的在减少段大小的一段时间后需要尝试一个更大的数值TCP状态转换FIN_WAIT_1 、FIN_WAIT1、TIME_WATI 称做主动关闭表示当本地程序发起一个关闭请求时会进入的状态集合CLOSEWAIT、LASK_ACK 称作被动关闭。从LISTEN 到 SYN_SENT 的状态转换是合法的从SYNC_RCV返回到LISTEN的状态只有在SYNRCVD状态是有LISTEN状态而非SYN_SENT状态转换而来的情况下才是正确的。这意味着一个被动打来操作进入LISTEN状态接收一个SYN发送一个带ACK确认的SYN进入SYN_CRVD状态然后收到一个重置消息而非ACK,端点就会返回到LISTEN状态并等待另一个请求的。TIME_WATI状态在该状态中TCP将会等待2倍最大段生存期。当TCP发送一个主动关闭的并发送最终的ACK时连接必须处于TIME_WATI并报出2倍最大段生存期TIME_WAIT仅在主动调用的一方出现被动调用的一方会直接进入CLOSED状态。需要等待2MSL的原因是防止延迟的数据段被其他使用相同源地址、源端口。目的地址。目的端口的TCP收到保证TCP连接的远程被正确关闭延迟数据段为了保证新的TCP连接的数据段不会与还在网络中传输的历史连接的数据段重复TCP连接在分配新的序列号之前需要至少静默数据段在网络中存活的最长时间2MSL的原因是网络中可能存在来自发起方数据段当这些发起方的数据段被服务端处理后又会想客户端发起响应。所以一来一回需要2MSLFIN_WAIT2 状态在该状态某TCP通讯端已经发送FIN并已得到另一端的确认。除非出现半关闭状态否则该TCP端将会等待另一端识别出自己已经收到一个文件末尾的通知并关闭这一端引起发送FIN连接。同时打开和关闭的转换同时打开通信双方几乎同时想对方发送SYN报文段然后进入SYNCSENT。当他们收到对方的SYN会进入到SYN_CRVD。然后重新发送一个新的SYN并确认之前收到的SYN。当通信两端都收到了SYN和ACK时他们的状态都将变为ESTABLISED同时关闭两端同时从ESTABLISED变为FIN_WATI_1同时他们都会向地方发送FIN在接收到对方发来的FIN后两端变成CLOSED状态然后发送都发送ACK当双端接收到ACK后每个端都会将状态改为TIME_WAIT从而初始化2MSL重置报文段当发现一个到达的报文段对于相关连接而言不是正确的TCP就会发送一个重置报文段。当一个请求到达本地没有相关的进程在目的端口监听时就会产生一个重置报文段。半开连接在未知另一端的情况下通信的一端关闭或终止连接那么认为该条TCP连接为半开连接。只要不通过半开连接传递数据。正常工作的一端不会检测出另一端已经奔溃时间等待错误等待的一端不需要做任何操作只需要维持当前的状态到2MSL的计时结束。如果他在这段时间内接收到来自于这条连接的一些报文或是更加特殊的重置报文。它将被破坏。这种情况称作时间等待错误。连接队列一个并行的服务器会为每一个客户端分配一个新的进程或线程。在被用于应用程序之前可能会处于 1. 尚未完成但已经接收到SYN (SYNC_CRVD)。 2. 已经完成3次握手处于(ESTABLISHED)。在内部操作系统用2个不同的连接队列分别对应上述2中情况。当一个连接请求到达SYN报文将会检查系统参数net.ipv4.tcp_max_synbacklog。如果处于SYN_CRVD的个数超过这个阀值进入的连接将会被拒绝每一个处于监听状态下的节点都有一个固定长度的连接队列其中的TCP连接已经被接受但未被应用程序接受。如果监听节点的队列有空间存储新的连接TCP模块完成连接 客户端可能会认为服务器已经准备好接收数 据,然而服务器上的应用程序此时可能还未收到关于新连接的通知。如果这种情况发生,服 务器的TCP模块将会把到来的数据存人队列中如果队列中已经没有足够的空间存放新的连接TCP将会延迟对SYN的响应。参考资料为什么 TCP 建立连接需要三次握手 · Whys THE Design? - 面向信仰编程draveness.me为什么 TCP/IP 协议会拆分数据 · Whys THE Design? - 面向信仰编程draveness.mehttps://book.douban.com/subject/1088054/book.douban.comShadowTCP状态转换图总结zhuanlan.zhihu.com为什么 TCP 协议有 TIME_WAIT 状态 · Whys THE Design? - 面向信仰编程draveness.me