amp 网站开发,怎么做自己的卡盟网站,wordpress 微信扫码登录模板兔,东城网站设计目录
1、TCP概念及协议头部格式
1.1TCP特点
1.2TCP协议协议头部格式
1.3字段进行介绍
1.3.1源端口和目的端口
1.3.2序号(seq)
1.3.3确认序号(ack)
1.3.4数据偏移
1.3.5标志位
1.3.6窗口
1.3.7校验和
1.3.8紧急指针
2、TCP的可靠性
2.1 TCP可靠性的保障
2.2排序机…目录
1、TCP概念及协议头部格式
1.1TCP特点
1.2TCP协议协议头部格式
1.3字段进行介绍
1.3.1源端口和目的端口
1.3.2序号(seq)
1.3.3确认序号(ack)
1.3.4数据偏移
1.3.5标志位
1.3.6窗口
1.3.7校验和
1.3.8紧急指针
2、TCP的可靠性
2.1 TCP可靠性的保障
2.2排序机制
2.3确认应答机制
2.4重传机制
2.4.1超时重传机制
2.4.2快速重传机制
2.5选择确认机制
2.6TCP流量控制(滑动窗口协议) 2.7拥塞控制
3、TCP面向连接
3.1TCP连接的建立 3.2.1三次握手图解
3.2TCP连接释放 3.2.1四次挥手图解
4、三次握手、四次挥手的常见面试题
4.1问题1为什么关闭连接的需要四次挥手而建立连接却只要三次握手呢
4.2问题2为什么连接建立的时候是三次握手可以改成两次握手吗
4.3问题3为什么主动断开方在TIME-WAIT状态必须等待2MSL的时间
4.4问题4如果已经建立了连接但是Client端突然出现故障了怎么办 1、TCP概念及协议头部格式 TCP(传输控制协议)是一种面向连接(连接导向)的、可靠的、 有序、无丢失和无重复基于IP的传输层协议
1.1TCP特点 TCP是一种面向连接的传输协议只能适应于单播的数据通信 每一条TCP连接有且只能存在两个端点形成一种端到端的连接形式。 可靠、有序、无丢失和无重复 TCP是提供全双工通讯。 发送缓存已经发送但未收到确认的数据 想要发送的应用层数据 接收缓存按需到达但还未被应用程序提取的数据 乱序到达的数据
TCP是面向字节流的——套接字IPPort 即源IP、源端口、目IP、目端口-----TCP会话的四元组信息
1.2TCP协议协议头部格式 TCP首部如果不计选项和填充字段它通常是20个字节。
1.3字段进行介绍
1.3.1源端口和目的端口
TCP协议是基于IP协议的基础上传输的TCP报文中的源端口号源IP与TCP报文中的目的端口号目的IP一起组合起来唯一性的确定一条TCP连接。即表示数据从哪个进程发送发送到哪个进程去
1.3.2序号(seq)
TCP传输过程中在发送端出的字节流中传输报文中的数据部分的每一个字节都有它的编号。序号占32位发起方发送数据时都需要标记序号。 当SYN 1时当前为连接建立阶段此时的序号为初始序号ISN((Initial Sequence Number)通过算法来随机生成序号 在数据传输过程中TCP协议通过序号对上层提供有序的数据流。发送端可以用序号来跟踪发送的数据量接收端可以用序号识别出重复接收到的TCP包从而丢弃重复包对于乱序的数据包接收端也可以依靠序号对其进行排序。
1.3.3确认序号(ack)
占4字节是期望收到对方下次发送的数据的第一个字节的序号也就是期望收到的下一个报文段的首部中的序号确认序号应该是上次已成功收到数据字节序号1。
只有ACK标志为1时确认序号才有效。 确认序列号表明是接收方期望收到发送方发送的下一个字节的序号且表示之前的所有数据均已接收————累积确认 1.3.4数据偏移 占4比特表示数据开始的地方离TCP段的起始处有多远。实际上就是TCP段首部的长度。由于首部长度不固定因此数据偏移字段是必要的。 数据偏移以32位为长度单位也就是4个字节因此TCP首部的最大长度是60个字节。即偏移最大为15个长度单位1532位154字节。
1.3.5标志位 ACK确认位当ACK1时确认序列号有意义。在连接建立后所有传输的报文段都必须将该标记位置为1。SYN同步位代表连接请求。FIN终止位表明此报文段发送方数据已发送完毕要求释放连接。RST复位当TCP连接出现严重错误时必须释放连接然后重新建立传输连接。URG紧急位当URG1时表明此报文段中存在紧急数据是高优先级数据应尽快传输给应用层程序处理不再缓存在排队。配合紧急指针使用。PSH推送位当PSH1时接收方应尽快交付数据给应用层程序不再等待缓存填满再向上交付。 1.3.6窗口
长度为16位共2个字节。此字段用来进行流量控制。流量控制的单位为字节数这个值是本端期望一次接收的字节数。
所谓滑动窗口可以理解成接收端所能提供的缓冲区大小。TCP利用一个滑动的窗口来告诉发送端对它所发送的数据能提供多大的缓 冲区。
1.3.7校验和
长度为16位共2个字节。对整个TCP报文段即TCP头部和TCP数据进行校验和计算接收端用于对收到的数据包进行验证。
1.3.8紧急指针
只有当URG标志置1时紧急指针才有效。紧急指针是一个正的偏移量和序号字段中的值相加表示紧急数据最后一个字节的序号。标识哪部分数据是紧急数据优先处理这部数据
2、TCP的可靠性
2.1 TCP可靠性的保障
1应用数据分割成TCP认为最适合发送的数据块。这部分是通过MSS最大数据包长度选项来控制的通常这种机制也被称为一种协商机制MSS规定了TCP传往另一端的最大数据块的长度。值得注意的是MSS只能出现在SYN报文段中若一方不接收来自另一方的MSS值则MSS就定为536字节。一般来讲MSS值还是越大越好这样可以提高网络的利用率。
2重传机制。设置定时器等待确认包如果定时器超时还没有收到确认包则报文重传。
3对首部和数据进行校验。
4接收端对收到的数据进行排序然后交给应用层。
5接收端丢弃重复的数据。
6TCP还提供流量控制主要是通过滑动窗口来实现流量控制。
至此TCP协议的数据帧格式介绍完了。接下来开始为大家重点介绍TCP传输层的三次握手建立连接四次挥手释放连接。
2.2排序机制
当进行一条数据发送的时候首先TCP会将这条数据拆分成不同的片段然后把片段进行一个排序。然后把排序号的片段顺序进行发送。这样保证了传输的有序性。
MTU---最大传输单元MSS---最大段长度----TCP分段---该参数是需要在TCP建立握手过程中通过前两次SYN报文段来进行协商确定。 如果在本地进行了分段操作则不需要进行分片操作
2.3确认应答机制
向对方发送一个数据报对方要返回一个确认应答的数据报
实现的方式序号和确认序号保证了响应应答针对的是哪一条消息的应答 实际上TCP的序号并不是一条一条来编号的因为TCP是面向字节流的所以TCP的序号也是按照字节来编号的 假设一条数据是1000个字节那么假设他从1开始编号此时第一个字节序号就是1第二个字节序号就是2......以此类推最后一个字节序号就是1000。 但是由于这1000个字节都属于同一个TCP报文所以TCP报头里就只记录当前的第一个字节序号当A发送的第一条数据到达B之后B会返回一个应答报文该应答报文的序号是1001表示前1000个字节的数据我已经收到了现在A现在要发送第1001个字节的数据了B向A索要1001的数据 2.4重传机制
TCP要保证所有的数据包都可以到达所以必需要有重传机制。 注意: 接收端给发送端的Ack确认只会确认最后一个连续的包比如发送端发了1,2,3,4,5一共五份数据接收端收到了12于是回ack 3然后收到了4注意此时3没收到此时的TCP会怎么办 我们要知道因为正如前面所说的SeqNum和Ack是以字节数为单位所以ack的时候不能跳着确认只能确认最大的连续收到的包不然发送端就以为之前的都收到了。 2.4.1超时重传机制
一种是不回ack死等3当发送方发现收不到3的ack超时后会重传3。一旦接收方收到3后会ack 回 4——意味着3和4都收到了。2.4的问题
但是这种方式会有比较严重的问题那就是因为要死等3所以会导致4和5即便已经收到了而发送方也完全不知道发生了什么事因为没有收到Ack所以发送方可能会悲观地认为也丢了所以有可能也会导致4和5的重传。
对此有两种选择
① 一种是仅重传timeout的包。也就是第3份数据。
② 另一种是重传timeout后所有的数据也就是第345这三份数据。 这两种方式有好也有不好。第一种会节省带宽但是慢第二种会快一点但是会浪费带宽也可能会有无用功。但总体来说都不好。因为都在等timeouttimeout可能会很长。
总结 在确认应答机制中只是做出了数据传输顺利的情况但是如果数据传输不顺利呢A发送完后却数据迟迟收不到应答报文即 “丢包” 情况丢包主要有两种 1、A发送的数据丢了 2、B返回的应答报文ack丢了 当出现丢包情况时TCP就会启动超时重传机制即重新发送一遍相同的数据 在这里TCP引入了一个时间阈值当发送方发送数据时就会开始计时如果到达时间阈值后也没有收到接收方返回的ack此时不管是ack还在路上还是丢包了都统一认为是丢包发送方会重新发送数据 超时重传机制超过一定时间还未响应就重新发送数据 但是这个时间阈值具体时间多少就要根据系统来决定没有一个绝对值 2.4.2快速重传机制
RTT---往返时间
RTO---超时重传时间略大于RTT时间---动态变化的数值。加倍的形式进行变化。
在快速重传机制中并不是因为RTO时间到达从而触发重传机制该重传机制是根据对端的反馈信息进行重传当连续3三收到相同的ACK报文时发送端会重传数据。这3个连续的ACK报文被称为冗余ACK
2.5选择确认机制 若收到的报文段无差错只是未按序号中间还缺少一些序号的数据那么能否设法只传送缺少的数据而不重传已经正确到达接收方的数据? 答案是可以的。选择确认就是-种可行的处理方法。
在TCP首部的选项字段提供了SACK的选项它可以将已收到的数据的信息边界信息发送给「发送方」这样发送方就可以知道哪些数据收到了哪些数据没收到知道了这些信息就可以只重传丢失的数据 注意选择确认机制也是需要进行协商的 2.6TCP流量控制(滑动窗口协议)
TCP流量控制主要是针对接收端的处理速度不如发送端发送速度快的问题消除发送方使接收方缓存溢出的可能性。
TCP流量控制主要使用滑动窗口协议滑动窗口是接受数据端使用的窗口大小用来告诉发送端接收端的缓存大小以此可以控制发送端发送数据的大小从而达到流量控制的目的。这个窗口大小就是我们一次传输几个数据。对所有数据帧按顺序赋予编号发送方在发送过程中始终保持着一个发送窗口只有落在发送窗口内的帧才允许被发送同时接收方也维持着一个接收窗口只有落在接收窗口内的帧才允许接收。这样通过调整发送方窗口和接收方窗口的大小可以实现流量控制。 窗口指定的是无需等待确认应答而可以继续发送数据包的最大值。 窗口大小体现在缓存区的大小 TCP要求发送方依据接收窗口rwnd来控制数据的发送量。rwnd等于接收方接收缓存大小减去已存数据量大小。即rwnd变量是可变的 接收端将自己剩余缓冲区大小存入TCP头部中的“16位窗口大小”字段 通过ACK通知发送端窗口大小越大说明网络吞吐量越高发送端根据接收到这个窗口的大小控制自己的发送速度如果接收缓冲区满了就会将窗口设置为0这时发送端不在发送数据而是定期的发送一个窗口探测报文只是为了知道窗口的大小让接收端将窗口大小告诉发送端 2.7拥塞控制
流量控制是通过接收方来控制流量的一种方式而拥塞控制则是通过发送方来控制流量的一种方式。TCP发送方可能因为IP网络的拥塞而被遏制TCP拥塞控制就是为了解决这个问题注意和TCP流量控制的区别。
TCP拥塞控制的几种方法慢启动拥塞避免快重传和快恢复。
这里先理解一个概念: 拥塞窗口 拥塞窗口发送方维持一个叫做拥塞窗口 cwnd的状态变量。拥塞窗口的大小取决于网络的拥塞程度并且动态变化。 发送方的让自己的发送窗口min(cwnd接受端接收窗口大小。说明: 发送方取拥塞窗口与滑动窗口的最小值作为发送的上限。 发送方控制拥塞窗口的原则是只要网络没有出现拥塞拥塞窗口就增大一些以便把更多的分组发送出去。但只要网络出现拥塞拥塞窗口就减小一些以减少注入到网络中的分组数。
3、TCP面向连接
3.1TCP连接的建立
TCP连接建立需要解决的问题
1、要使双方均知晓对方的套接字信息。
2、允许双方进行参数协商MSS、窗口值、是否使用选择确认机制
3、给各设备进行资源分配3.2.1三次握手图解 TCP连接的建立时双方需要经过三次握手具体过程如下 1第一次握手Client进入SYN_SENT状态发送一个SYN帧来主动打开传输通道该帧的SYN标志位被设置为1同时会带上Client分配好的SN序列号该SN是根据时间产生的一个随机值通常情况下每间隔4ms会加1。除此之外SYN帧还会带一个MSS最大报文段长度可选项的值表示客户端发送出去的最大数据块的长度。
2第二次握手Server端在收到SYN帧之后会进入SYN_RCVD状态同时返回SYNACK帧给Client主要目的在于通知ClientServer端已经收到SYN消息现在需要进行确认。Server端发出的SYNACK帧的ACK标志位被设置为1其确认序号ANAcknowledgment Number值被设置为Client的SN1SYNACK帧的SYN标志位被设置为1SN值为Server端生成的SN序号SYNACK帧的MSS最大报文段长度表示的是Server端的最大数据块长度。
3第三次握手Client在收到Server的第二次握手SYNACK确认帧之后首先将自己的状态会从SYN_SENT变成ESTABLISHED表示自己方向的连接通道已经建立成功Client可以发送数据给Server端了。然后Client发ACK帧给Server端该ACK帧的ACK标志位被设置为1其确认序号ANAcknowledgment Number值被设置为Server端的SN序列号1。还有一种情况Client可能会将ACK帧和第一帧要发送的数据合并到一起发送给Server端。
4Server端在收到Client的ACK帧之后会从SYN_RCVD状态会进入ESTABLISHED状态至此Server方向的通道连接建立成功Server可以发送数据给ClientTCP的全双工连接建立完成。
3.2TCP连接释放
1、对双方各自资源的释放过程
2、任何一方都可以在数据传输结束后发送连接释放通知 四次挥手具体过程具体如下 1第一次挥手主动断开方可以是客户端也可以是服务器端向对方发送一个FIN结束请求报文此报文的FIN位被设置为1并且正确设置Sequence Number序列号和Acknowledgment Number确认号。发送完成后主动断开方进入FIN_WAIT_1状态这表示主动断开方没有业务数据要发送给对方准备关闭SOCKET连接了。
2第二次挥手正常情况下在收到了主动断开方发送的FIN断开请求报文后被动断开方会发送一个ACK响应报文报文的Acknowledgment Number确认号值为断开请求报文的Sequence Number序列号加1该ACK确认报文的含义是“我同意你的连接断开请求”。之后被动断开方就进入了CLOSE-WAIT关闭等待状态TCP协议服务会通知高层的应用进程对方向本地方向的连接已经关闭对方已经没有数据要发送了若本地还要发送数据给对方对方依然会接受。被动断开方的CLOSE-WAIT关闭等待还要持续一段时间也就是整个CLOSE-WAIT状态持续的时间。
主动断开方在收到了ACK报文后由FIN_WAIT_1转换成FIN_WAIT_2状态。
3第三次挥手在发送完成ACK报文后被动断开方还可以继续完成业务数据的发送待剩余数据发送完成后或者CLOSE-WAIT关闭等待截止后被动断开方会向主动断开方发送一个FINACK结束响应报文表示被动断开方的数据都发送完了然后被动断开方进入LAST_ACK状态。
4第四次挥手主动断开方收在到FINACK断开响应报文后还需要进行最后的确认向被动断开方发送一个ACK确认报文然后自己就进入TIME_WAIT状态等待超时后最终关闭连接。处于TIME_WAIT状态的主动断开方在等待完成2MSL的时间后如果期间没有收到其他报文则证明对方已正常关闭主动断开方的连接最终关闭。
被动断开方在收到主动断开方的最后的ACK报文以后最终关闭了连接自己啥也不管了。 3.2.1四次挥手图解 4、三次握手、四次挥手的常见面试题 4.1问题1为什么关闭连接的需要四次挥手而建立连接却只要三次握手呢 关闭连接时被动断开方在收到对方的FIN结束请求报文时很可能业务数据没有发送完成并不能立即关闭连接被动方只能先回复一个ACK响应报文告诉主动断开方“你发的FIN报文我收到了只有等到我所有的业务报文都发送完了我才能真正的结束在结束之前我会发你FINACK报文的你先等着”。所以被动断开方的确认报文需要拆开成为两步故总体就需要四步挥手。
而在建立连接场景中Server端的应答可以稍微简单一些。当Server端收到Client端的SYN连接请求报文后其中ACK报文表示对请求报文的应答SYN报文用来表示服务端的连接也已经同步开启了而ACK报文和SYN报文之间不会有其他报文需要发送故而可以合二为一可以直接发送一个SYNACK报文。所以在建立连接时只需要三次握手即可。 4.2问题2为什么连接建立的时候是三次握手可以改成两次握手吗 关闭连接时被动断开方在收到对方的FIN结束请求报文时很可能业务数据没有发送完成并不能立即关闭连接被动方只能先回复一个ACK响应报文告诉主动断开方“你发的FIN报文我收到了只有等到我所有的业务报文都发送完了我才能真正的结束在结束之前我会发你FINACK报文的你先等着”。所以被动断开方的确认报文需要拆开成为两步故总体就需要四步挥手。
如果把三次握手改成两次握手可能发生死锁。两次握手的话缺失了Client的二次确认ACK帧假想的TCP建立的连接时二次挥手可以如下图所示 在假想的TCP建立的连接时二次握手过程中Client发送Server发送一个SYN请求帧Server收到后发送了确认应答SYNACK帧。按照两次握手的协定Server认为连接已经成功地建立了可以开始发送数据帧。这个过程中如果确认应答SYNACK帧在传输中被丢失Client没有收到Client将不知道Server是否已准备好也不知道Server的SN序列号Client认为连接还未建立成功将忽略Server发来的任何数据分组会一直等待Server的SYNACK确认应答帧。而Server在发出的数据帧后一直没有收到对应的ACK确认后就会产生超时重复发送同样的数据帧。这样就形成了死锁。 4.3问题3为什么主动断开方在TIME-WAIT状态必须等待2MSL的时间 原因之一主动断开方等待2MSL的时间是为了确保两端都能最终关闭。假设网络是不可靠的被动断开方发送FINACK报文后其主动方的ACK响应报文有可能丢失这时候的被动断开方处于LAST-ACK状态的由于收不到ACK确认被动方一直不能正常的进入CLOSED状态。在这种场景下被动断开方会超时重传FINACK断开响应报文如果主动断开方在2MSL时间内收到这个重传的FINACK报文会重传一次ACK报文后再一次重新启动2MSL计时等待这样就能确保被动断开方能收到ACK报文从而能确保被动方顺利进入到CLOSED状态。只有这样双方都能够确保关闭。反过来说如果主动断开方在发送完ACK响应报文后不是进入TIME_WAIT状态去等待2MSL时间而是立即释放连接则将无法收到被动方重传的FINACK报文所以不会再发送一次ACK确认报文此时处于LAST-ACK状态的被动断开方无法正常进入到CLOSED状态。
原因之二防止“旧连接的已失效的数据报文”出现在新连接中。主动断开方在发送完最后一个ACK报文后再经过2MSL才能最终关闭和释放端口这就意味着相同端口的新TCP新连接需要在2MSL的时间之后才能够正常的建立。2MSL这段时间内旧连接所产生的所有数据报文都已经从网络中消失了从而确保了下一个新的连接中不会出现这种旧连接请求报文。 4.4问题4如果已经建立了连接但是Client端突然出现故障了怎么办 、TCP还设有一个保活计时器Client端如果出现故障Server端不能一直等下去这样会浪费系统资源。每收到一次Client客户端的数据帧后Server端都的保活计时器会复位。计时器的超时时间通常是设置为2小时若2小时还没有收到Client端的任何数据帧Server端就会发送一个探测报文段以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应Server端就认为Client端出了故障接着就关闭连接。如果觉得保活计时器的两个多小时的间隔太长可以自行调整TCP连接的保活参数。