精华内容
下载资源
问答
  • 2020-06-26 15:13:50

    TCP

    TCP 特点

    TCP 是面向连接的运输层协议,一个应用进程在向另一个进程发送数据之前,两个进程必须先建立 TCP 连接,发送某些预备报文段,以建立确保数据传输的参数。作为 TCP 连接建立的一部分,连接的双方都将初始化与 TCP 连接相关的许多状态变量。这种连接不是电路交换网络中的端到端电路这种物理连接,而是一种逻辑连接,TCP 报文要先传送到 IP 层加上 IP 首部后,再传到数据链路层,加上链路层的首部和尾部后才离开主机发送到物理层。

    TCP 连接提供全双工服务,允许通信双方的应用进程在任何时候都能发送数据。TCP 连接的两端都有各自的发送缓存和接收缓存,用来临时存放双向通信的数据。在发送时,应用程序把数据传送给 TCP 缓存后就可以做自己的事,而 TCP 在合适的时候会把数据发送出去。在接收时,TCP 把收到的数据放入缓存,上层应用程序会在合适的时候读取缓存中的数据。

    TCP 连接是点对点的,每一条 TCP 连接只能有两个端点,即只能是单个发送方和单个接收方之间的连接。

    TCP 提供可靠的交付服务,通过 TCP 连接传送的数据无差错、不丢失、不重复,并且按序到达。

    TCP 是面向字节流的,流是指流入到进程或从进程中流出的字节序列。面向字节流的含义是:虽然应用程序和 TCP 的交互是一次一个数据块,但是 TCP 把应用程序交下来的数据仅仅看成一连串无结构的字节流。TCP 不保证接收方应用程序收到的数据块和发送方应用程序发出的数据块具有对应大小的关系,但是接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。接收方应用程序必须有能力识别收到的字节流,并把它还原成有意义的应用层数据。


    TCP 报文结构

    TCP 传送的数据单元是报文段,一个 TCP 报文段分为首部和数据两部分。首部的前 20 个字节是固定的,后面有 4n 字节是根据需要而增加的选项,因此 TCP 首部的最小长度是 20 字节。

    **源端口和目的端口:**各占 2 字节,分别写入源端口号和目的端口号,TCP 的分用功能是通过端口实现的,分用就是指运输层从 IP 层收到发送给各应用进程的数据后,把数据交付给正确的套接字的工作。

    **序号:**占 4 字节。TCP 是面向字节流的,在一个 TCP 连接中传送的字节流中的每一个字节都按顺序编号,首部中的序号字段值指的是本报文段所发送的数据的第一个字节的序号。序号使用 mod232 计算,每增加到 231-1 后下一个序号就又回到 0。

    **确认号:**占 4 字节,是期望收到对方下一个报文段的第一个数据字节的序号。如果确认号为 N,代表到序号 N-1 为止的所有数据已经正确收到。序号有 32 位长,一般情况下可以保证当序号重复使用时,旧序号的数据早已通过网络到达终点了。

    **数据偏移:**占 4 字节,实际是TCP 报文段的首部长度,指出了 TCP 报文段的数据起始处到 TCP 报文段的起始处的距离。由于首部中有长度不确定的选项字段,因此数据偏移字段是必要的。

    **标志字段:**占 6 位。URG 是紧急标志,URG=1 时告诉系统此报文段中有紧急数据,应尽快传送,而不按照原来的排队顺序传送,和紧急指针配合使用,紧急指针指出了本报文段中紧急数据的字节数和位置。ACK 是确认标志,ACK=1 时表示成功接收了报文段。SYN 是同步标志,在建立连接时用来同步序号,当 SYN=1 而 ACK=0 时,表示一个连接请求报文段,响应时 SYN 和 ACK 都为 1,因此 SYN=1 表示一个连接请求或连接响应报文。FIN 是终止标志,用来释放一个连接,当 FIN=1 时表示报文段发送方的数据已发送完毕,并要求释放连接。PSH 是推送标志,PSH=1 时接收方就不等待整个缓存填满了再向上交付而是尽快交付数据。RST 是复位标志,当 RST=1 时表示 TCP 连接出现了严重错误,必须释放连接再重新建立连接。

    **接收窗口:**占 2 字节,指的是发送本报文段一方的接收窗口,告诉对方从本报文首部的确认号算起允许对方发送的数据量。窗口值是用来限制发送方的发送窗口的,因为接收方的数据缓存空间是有限的。

    **检验和:**占 2 字节,检验范围包括首部和数据两部分。在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。


    可靠传输协议 ARQ

    自动重传请求 ARQ 包括了停止等待协议、回退 N 步协议和选择重传协议,后两种结合了窗口机制,属于连续 ARQ 协议。

    停止等待协议

    停止等待就是每发送完一个分组就停止发送,等待对方的确认,在收到确认之后再发送下一个分组。停止等待协议包括了三种情况:

    1. 无差错情况

    A 发送分组 M1,发送完后就暂停并等待 B 的确认。B 收到了 M1 之后就向 A 发送确认,当 A 收到确认之后就再发送下一个分组 M2

    2. 出现差错的情况

    当 B 收到 M1 时检测出了差错就丢弃了 M1,其他什么也不做,也可能是 M1 在传输过程中丢失了,B 什么都不知道。在这两种情况下 B 都不会发送任何确认信息,解决方法是:A 只要超过一段时间没有收到确认就认为刚才发送的分组丢失了,因而重传前面发过的分组,这就叫超时重传。要实现超时重传,就要在每发送完一个分组时设置一个超时计时器,如果在超时计时器到期之间收到了对方的确认就进行撤销。

    有三点需要注意:① A 在发送完一个分组后必须暂时保留已发送分组的副本在超时重传时使用,只有在收到确认后才清除副本。② 分组和确认分组都必须进行编号,这样才能明确是哪一个发送出去的分组进行了确认。③ 超时计时器设置的时间应当比数据在分组传输的平均往返时间稍长一些,如果设置过短会产生不必要的重传,如果设置过长会降低通信效率。

    3. 确认丢失和确认迟到

    B 发送的对 M1 的确认丢失了,A 在设定的超时重传时间内没有收到确认,并不值得是自己发送的问题还是 B 的问题,因此 A 就会超时重传。假设 B 又收到了重传分组 M1,此时 B 会采取两个行动:① 丢弃这个分组,不向上层交付。② 重新向 A 发送确认。

    还有另一种情况就是 B 发送的确认并没有丢失但是迟到了,A 会受到重复的确认,此时 A 会收下并丢弃。通常 A 最终总是可以收到对所有发出的分组的确认,如果 A 不断重传分组但总是收不到确认,就说明通信线路质量太差,不能进行通信。

    停止等待协议的优点是简单,但缺点是信道利用率太低。为了提高传输效率,发送方可以不使用停止等待协议,而是采用流水线传输。流水线传输就是发送方可连续发送多个分组,不必每发送完一个分组就停下来等待对方的确认。这样可以使信道上一直有数据不间断地传送,流水线传输中可能会遇到差错,解决差错的两种基本方法是回退 N 步和选择重传。


    回退 N 步协议

    在回退 N 步即 GBN 协议中,允许发送方发送多个分组而不需要等待确认。在 GBN 中发送方看到的序号可以分为四个范围,已经发送且被确认的的序号、已经发送还未确认的序号、允许发送但还未发送的序号和不允许发送的序号。其中已经发送但还未确认的序号和允许发送但还未发送的序号可以被看作一个长度为 N 的窗口,随着协议的运行该窗口在序号空间向前滑动,因此 GBN 协议也被称为滑动窗口协议。

    GBN 发送方必须响应三种类型的事件:

    • 上层的调用

      当上层调用发送方法时,发送方首先检查发送窗口是否已满,即是否有 N 个已发送但未确认的分组。如果窗口未满,则产生一个分组并将其发送并更新相应变量,如果窗口已满,发送方指需将数据返回给上层,隐式说明该窗口已满。实际实现中,发送方更可能缓存而不是立即发送这些数据,或者使用同步机制允许上层在仅当窗口不满时才调用发送方法。

    • 收到一个 ACK

      在 GBN 协议中,对序号为 n 的分组确认采用累积确认的方式,对按序到达的最后一个分组发送确认,表明接收方已经正确接收到序号为 n 的以前且包括 n 在内的所有分组。例如发送了序号为 1~5 的五个分组,除了第三个全部收到了,那么确认序号就是 2。

    • 超时事件

      回退 N 步的名字来源于出现丢失和时延过长时发送方的行为,就像在停止等待协议中那样,如果超时,发送方会重传所有已经发送但还未确认过的分组。如果收到一个 ACK,但仍有已发送但未确认的分组,则计时器也会重新启动。

    在 GBN 协议中,接收方丢弃所有失序分组,即使是正确接收的也要丢弃,这样做的理由是接收方必须按序将数据交付给上层。这种做法的优点是接收缓存简单,即接收方不需要缓存任何失序分组。不过丢弃一个正确失序分组的缺点是随后对该分组的重传也许也会错误,而导致更多的重传。


    选择重传协议

    GBN 协议潜在地允许用多个分组填充流水线,因此避免了停止等待协议中的信道利用问题,但是 GBN 本身也存在性能问题,单个分组的差错就能引起 GBN 重传大量分组,许多分组根本没有重传的必要。随着信道差错率的增加,流水线可能会被这些不必要重传的分组所充斥。

    选择重传即 SR 协议,通过让发送方仅重传哪些它怀疑在接收方出错的分组而避免了不必要的重传。这种个别的、按需重传要求接收方逐个地确认正确接收的分组,再次用窗口长度 N 来限制流水线中未完成和未被确认的分组数。与 GBN 不同的是,发送方已经收到了窗口中对某些分组的 ACK。

    SR 接收方将确认一个正确接收的分组而不管其是否按需,失序的分组将被缓存直到所有丢失分组都被收到为止,这时才可以将一批分组按序交付给上层。


    TCP 可靠原理

    TCP 的可靠传输包含很多机制,例如使用检验和来检测一个传输分组中的比特错误、使用定时器来用于超时重传一个分组、使用序号来检测丢失的分组和冗余副本、使用确认来告诉发送方确认的分组信息、使用否定确认来告诉发送方某个分组未被正确接收。

    TCP 的发送方仅需维持已发送过但未被确认的字节的最小序号和下一个要发送的字节的序号,从这种角度看 TCP 更像一个 GBN 协议。但是 TCP 和 GBN 有一些显著的区别,许多 TCP 实现会将正确接收但失序的报文段缓存起来。当分组 n 丢失时,GBN 会重传 n 之后的所有分组,但是 TCP 至多只会重传分组 n。对 TCP 提出的一种修改意见是选择确认,它允许 TCP 接收方有选择地确认失序报文段,而不是累积地确认最后一个正确接收的有序报文段,从这个角度看 TCP 又像 SR 协议。因此 TCP 的差错恢复机制是一种 GBN 和 SR 的结合体

    除此之外,TCP 还使用流量控制拥塞控制来保证可靠性。

    流量控制

    如果某个应用程序读取数据的速度较慢,而发送方发送得太多、太快,发送的数据就会很容易使连接的接收缓存溢出,TCP 为它的应用程序提供了流量控制以消除发送方使接收方缓存溢出的可能性。流量控制是一个速度匹配服务,即发送方的发送速率与接收方的应用程序读取速率相匹配。

    TCP 通过让发送方维护一个接收窗口的变量来提供流量控制。通俗地说,接收窗口用于给发送方一个指示,该接收方还有多少可用的缓存空间,因此方法方的发送窗口不能超过接收方给出的接收窗口的数值。因为 TCP 是全双工通信,在连接两端的发送方都各自维护一个接收窗口。

    当接收窗口 rwnd 减小到 0 时,就不再允许发送方发送数据了。但是可能存在一种情况,当发生了零窗口报文段不久后,发送方的接收缓存又有了一些存储空间,因此又发生了新的报文说明自己的接收窗口大小,但是这个报文可能会在传输过程中丢失。接收方就会一直等待发送方的非零窗口通知,而发送方也一直在等待接收方发送数组,形成一种死锁的状态。为了解决这个问题,TCP 为每一个连接设有一个持续计时器,只要 TCP 连接的一方收到对方的零窗口通知就启动该计时器,到期后发送一个零窗口探测报文,如果仍为 0 就重新设置计时器的时间,如果对方给出了新的窗口值就可以解决可能出现的死锁问题。

    还有一种问题叫做糊涂窗口综合症,当接收方处理接收缓冲区数据很慢时,就会使应用进程间传送的有效数据很小, 极端情况下有效数据可能只有 1 字节但传输开销却有 40 字节(20字节的 IP 头以及 20 字节的 TCP 头) ,导致网络效率极低。为了解决这个问题,可以让接收方等待一段时间,使得接收缓存有足够的空间容纳一个最长报文段或者等到接收缓存已有一半的空闲空间。发送方也不要发送太小的报文,而是把数据积累成足够大的报文或达到接收方缓存空间的一半时才发送。

    拥塞控制

    网络中对资源需求超过了资源可用量的情况就叫做拥塞。当吞吐量明显小于理想的吞吐量时就出现了轻度拥塞,当吞吐量随着负载的增加反而下降时,网络就进入了拥塞状态。当吞吐量降为 0 时,网络已无法正常工作并陷入死锁状态。拥塞控制就是尽量减少注入网络的数据,减轻网络中的路由器和链路的负担。拥塞控制是一个全局性的问题,它涉及网络中的所有路由器和主机,而流量控制只是一个端到端的问题,是两个端点之间通信量的控制。

    根据网络层是否为运输层拥塞控制提供显式帮助可以将拥塞控制的方法区分为两种:端到端拥塞控制和网络辅助的拥塞控制。TCP 使用端到端的拥塞控制,因为 IP 层不会向端系统提供显式的网络拥塞反馈。TCP 所采取的方法是让每一个发送方根据所感知到的网络拥塞程度来限制其向连接发送数据的速率。如果一个 TCP 发送方感知到它到目的地之间的路径上没什么拥塞则会增加发送速率,如果发送方感知到拥塞就会降低其发送速率。限制发送速率是通过拥塞窗口来实现的,它对发送方能向网络中发送流量的速率进行了限制。判断拥塞是通过超时或者连续接收到 3 个冗余 ACK 实现的。

    TCP 的拥塞控制算法主要包括了慢启动、拥塞避免和快恢复。慢启动和拥塞避免是 TCP 的强制部分,差异在于对收到的 ACK 做出反应时 cwnd 增加的方式,慢启动比拥塞避免要更快地增加 cwnd 的长度。快恢复是推荐部分,对 TCP 发送方不是必需的。

    1. 慢启动

    在慢启动状态,拥塞窗口 cwnd 的值以一个 MSS 最大报文段开始并且每当传输的报文段首次被确认就增加一个 MSS。因此每经过一个 RTT 往返时间,拥塞窗口就会翻倍,发送速率也会翻倍。因此 TCP 的发送速率起始很慢,但是在慢启动阶段以指数增长。

    结束慢启动有三种情况:① 如果存在一个超时指示的丢包事件,即发生了拥塞,TCP 发送方就会将 cwnd 设置为 1 并重新开始慢启动过程。它还将慢启动阈值设置为 cwnd/2,即检测到拥塞时将慢启动阈值设置为拥塞窗口的一半。② 当拥塞窗口达到慢启动阈值时就会结束慢启动而进入拥塞避免模式。③ 最后一种结束慢启动的方式是,如果检测到三个冗余的 ACK,TCP 就会执行快重传并进入快恢复状态。

    2. 拥塞避免

    一旦进入拥塞避免状态,cwnd 的值大约是上次遇到拥塞时的值的一半,即距离拥塞可能并不遥远。因此 TCP 无法再每经过一个 RTT 就将 cwnd 的值翻倍,而是采用一种较为保守的方法,每个 RTT 后只将 cwnd 的值增加一个 MSS。这能够以几种方式完成,一种通用的方法是发送方无论何时收到一个新的确认,都将 cwnd 增加一个 MSS。

    当出现超时时,TCP 的拥塞避免和慢启动一样,cwnd 的值将被设置为 1,并且将慢启动阈值设置为 cwnd 的一半。

    3. 快恢复

    有时候个报文段丢失,而网络中并没有出现拥塞,如果使用慢启动算法就会降低传输效率。这时应该使用快重传来让发送方尽早知道出现了个别分组的丢失,快重传要求接收端不要等待自己发送数据时再捎带确认,而是要立即发送确认。即使收到了乱序的报文段后也要立即发出对已收到报文段的重复确认。当发送方连续收到三个冗余 ACK 后就知道出现了报文段丢失的情况,会立即重传并进入快恢复状态。

    在快恢复中,会调整慢启动阈值为 cwnd 的一半,并进入拥塞避免状态。


    TCP 连接和释放机制

    三次握手

    TCP 是全双工通信,任何一方都可以发起建立连接的请求,假设 A 是客户端,B 是服务器。

    初始 A 和 B 均处于 CLOSED 状态,B 会创建传输进程控制块 TCB 并进入 LISTEND 状态,监听端口是否收到了 TCP 请求以便及时响应。

    当 A 要发生数据时就向B发送一个连接请求报文,TCP 规定连接请求报文的 SYN=1,ACK=0,SYN不可以携带数据,但要消耗一个序号,假设此时 A 发送的序号 seq 为 x。发送完之后 A 就进入了 SYN-SENT 同步已发送状态。

    当 B 收到 A 的连接请求报文后,如果同意建立连接就会发送给 A 一个确认连接请求报文,其中 SYN=1,ACK=1,ack=x+1,seq=y,ack 的值为 A 发送的序号加 1,ACK 可以携带数据,如果不携带的话则不消耗序号。发送完之后,B进入 SYN-RCVD 同步已接收状态。

    当 A 收到 B 的确认连接请求报文后,还要对该确认再进行一次确认,报文的 ACK=1,ack=y+1,seq=x+1,发送后 A 进入 ESTABLISHED 状态,当 B 接收到该报文后也进入 ESTABLISHED 状态,客户端会稍早于服务器端建立连接。

    三次握手的原因主要有两个目的,信息对等和防止超时。

    从信息对等的角度看,双方只有确定 4 类信息才能建立连接,即 A 和 B 分别确认自己和对方的发送和接收能力正常。在第二次握手后,从 B 的角度看还不能确定自己的发送能力和对方的接收能力,只有在第三次握手后才能确认。

    三次握手也是防止失效连接突然到达导致脏连接,网络报文的生存时间往往会超过 TCP 请求超时时间,A 的某个超时连接请求可能会在双方释放连接之后到达 B,B 会误以为是 A 创建了新的连接请求,然后发送确认报文创建连接。因为 A 机器的状态不是 SYN_SENT,所以直接丢弃了 B 的确认数据。如果是两次握手,连接已经建立了,服务器资源被白白浪费。如果是三次握手,B 由于长时间没有收到确认信息,最终超时导致创建连接失败,因此不会出现脏连接。

    四次挥手

    当 A 已经没有要发送的数据时就会释放连接,会向 B 发送一个终止连接报文,其中 FIN=1,seq=u,u 的值为之前 A 发送的最后一个序号+1。发送完之后进入 FIN-WAIT-1 状态。

    B 收到该报文后,发送给 A 一个确认报文,ACK=1,ack=u+1,seq=v,v 的值为 B 之前发送的最后一个序号+1。此时 A 进入了FIN-WAIT-2 状态,B 进入了 CLOSE-WAIT 状态,但连接并未完全释放,B 会通知高层的应用层结束 A 到 B 方向的连接,此时 TCP 处于半关闭状态。

    当 B 发送完数据后准备释放连接时,就向 A 发送连接终止报文,FIN=1,同时还要重发ACK=1,ack=u+1,seq=w,seq 不是 v 的原因是在半关闭状态 B 可能又发送了一些数据,之后 B 进入 LAST-ACK 状态。

    A 收到连接终止报文后还要再进行一次确认,确认报文中 ACK=1,ack=w+1,seq=u+1。发送完之后进入 TIME-WAIT 状态,等待 2MSL之后进入 CLOSED 状态,B 收到该确认后进入 CLOSED 状态,服务器端会稍早于客户端释放连接。

    四次挥手的原因

    第一点原因是为了保证被动关闭方可以进入 CLOSED 状态。MSL 是最大报文段寿命,等待 2MSL 可以保证 A 发送的最后一个确认报文能被 B 接收,如果该报文丢失,B 没有收到就会超时重传之前的 FIN+ACK 报文,而如果 A 在发送确认报文后就立即释放连接就无法收到 B 超时重传的报文,因而也不会再一次发送确认报文段,B 就无法正常进入 CLOSED 状态。

    第二点原因是 2MSL 时间之后,本连接中的所有报文就都会从网络中消失,可以防止已失效连接的请求数据包与正常连接的请求数据包混淆而发生异常。

    除此之外,TCP 还设有一个保活计时器,用于解决客户端主机故障的问题,服务器每收到一次客户的数据就重新设置保活计时器,时间为 2 小时。如果 2 小时内没有收到就间隔 75 秒发送一次探测报文,连续 10 次都没有响应后就关闭连接。


    更多相关内容
  • TCP是面向连接的:在一个应用进程开始向另一个应用进程发送数据之前,这两个进程必须相互发送某些预备报文段,以建立确保数据传输的参数(三次握手)。tcp连接状态完全保留在两个端系统TCP协议只在端系统运行...

    TCP是面向连接的:在一个应用进程开始向另一个应用进程发送数据之前,这两个进程必须相互发送某些预备报文段,以建立确保数据传输的参数(三次握手)。

    tcp连接状态完全保留在两个端系统中。TCP协议只在端系统中运行,不在中间的路由器和链路层交换机中运行,故中间的网络元素不会维持TCP连接状态。中间路由器对TCP连接完全视而不见,看到的只是数据报,而不是连接。

    TCP连接提供全双工服务;是点对点的。

    客户进程通过套接字传递数据流,数据一旦通过该门,就由客户中运行的TCP控制,TCP将数据引导到该连接的发送缓存(三次握手初期设置的)里。TCP在它方便时从发送缓存取出数据,以报文段的形式发送数据。从发送缓存中个取出并放入报文段中的数据数量受限于最大报文段长度MSS(报文段里应用层数据的最大长度)。MSS根据最初确定的由本地发送主机发送的最大链路层帧长度(即最大传输单元MTU)设置。设置MSS要保证一个TCP报文段加上TCP/IP首部长度(通常40字节)将适合单个链路层帧。接收端从网络中收到一个报文段后,将报文段的数据放入接收缓存。应用程序从此缓存中读取数据。

    TCP每一端都有自己的发送缓存和接收缓存。

    TCP报文段结构

    TCP报文段由首部字段和数据字段组成:

    源端口号(16)

    目的端口号(16)

    序号(32)

    确认号(32)

    首部长度(4)

    保留未用(6)

    代码位(6)

    接收窗口(16)

    因特网检验和(16)

    紧急数据指针

    选项(长度可变)

    填充

    数据部份(长度可变)





     


    1. 源端口和目的端口:各占2个字节。
    2. 序号:占4字节。序号范围是0~2^32-1。TCP是面向字节流的,TCP连接中传送的字节流中的每个字节都按顺序编号。整个要传送的字节流的起始序号必须要在连接建立时设置。首部中的序号字段值指的是本报文段所发送的数据的第一个字节的序号。
    3. 确认号:4个字节,是期望收到对方下一个报文段的第一个数据字节的序号。 
      若确认号=N,则表明:到序号N-1为止的所有数据都已正确收到。
    4. 首部长度:4位。指出TCP报文段的数据起始处距离报文段的起始处有多远。这个字段实际上是指出TCP报文段的首部长度。由于首部中还有长度不确定的选项字段,因此数据偏移字段是必要的。单位是32位,也就是4字节,4位二进制最大表示15,所以数据偏移也就是TCP首部最大60字节(通常选项字段为空,故TCP首部的典型长度为20字节)
    5. 保留:6位 
      下面有6个控制位说明本报文段的性质:
    6. 紧急URG:1位 
      当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据),而不要按原来的排队顺序来传送。例如,已经发送了很长的一个程序在远地的主机上运行。但后来发现了一些问题,需要取消该程序的运行。因此用户从键盘发出中断命令(Control+c)。如果不使用紧急数据,那么这两个字符将存储在接收TCP的缓存末尾。只有在所有的数据被处理完毕后这两个字符才被交付接收方的应用进程。这样做就浪费了许多时间。

      当URG置为1时,发送应用进程就告诉发送方的TCP有紧急数据要传送。于是发送方TCP就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍时普通数据。这时要与首部中紧急指针字段配合使用。

    7. 确认ACK 
      仅当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。TCP规定,在连接建立后所有的传送的报文段都必须把ACK置1。

    8. 推送PSH 
      当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应。在这种情况下,TCP就可以使用推送操作。这时,发送方TCP把PSH置1,并立即创建一个报文段发送出去。接收方TCP收到PSH=1的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后向上交付。

      虽然应用程序可以选择推送操作,但推送还很少使用。

    9. 复位RST 
      tcp连接出现严重差错时释放连接,然后重新建立连接。而可以用来拒绝一个非法的报文段或拒绝打开一个连接。

      当RST=1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。RST置1还用来拒绝一个非法的报文段或拒绝打开一个连接。

    10. 同步SYN 
      在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在相应的报文段中使用SYN=1和ACK=1。因此,SYN置为1就表示这是一个连接请求或连接接受报文段。

    11. 终止FIN 
      用来释放一个连接。当FIN=1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。

    12. 接收窗口 占2字节。窗口值是【0,2^16-1]之间的整数。窗口指的是发送本报文段的一方的接收窗口(而不是自己的发送窗口)。窗口值告诉对方: 从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。总之,窗口值作为接收方让发送方设置其发送窗口的依据。并且窗口值是经常在动态变化着。

    13. 检验和:2字节。检验范围包括首部数据两部分。和UDP用户数据报一样,在计算校验和 时,要在TCP报文段加上12字节的伪首部。

    14. 紧急指针:2字节。紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据)。因此,紧急指针指出了紧急数据的末尾在报文段中的位置。当所有紧急数据都处理完时,TCP就告诉应用程序恢复到正常操作。值得注意的是,即使窗口为零时也可发送紧急数据。

    15. 选项:长度可变,最长可达40字节。当没有使用“选项”时,TCP的首部长度是20字节。 
      1)MSS 最大报文段长度 
      MSS最大报文段长度(数据字段的最大长度,默认是536字节)。MSS不宜设的太大也不宜设的太小。若选择太小,极端情况下,TCP报文段只含有1字节数据,在IP层传输的数据报的开销至少有40字节(包括TCP报文段的首部和IP数据报的首部)。这样,网络的利用率就不会超过1/41。若TCP报文段非常长,那么在IP层传输时就有可能要分解成多个短数据报片。在终点要把收到的各个短数据报片装配成原来的TCP报文段。当传输出错时还要进行重传,这些也都会使开销增大。

      因此MSS应尽可能大,只要在IP层传输时不需要再分片就行。在连接建立过程中,双方都把自己能够支持的MSS接入这一字段,以后就按照这个数值传送数据。 
      2)窗口扩大 
      窗口扩大选项是为了扩大窗口。TCP首部中窗口字段长度是16位,因此最大窗口大小就是64k字节。对于包含卫星信道的网络可能是不够用的。可以在双方初始建立TCP连接的时候就进行协商。 
      3)时间戳(计算RTT,防止序号绕回) 
      A. 用来计算往返时间RTT。发送方在发送报文段时把当前时钟的时间值放入时间戳字段,接收方在确认该报文段时把时间戳字段值复制到时间戳回送回答字段。因此,发送方在收到确认报文后,可以准确地计算RTT来。 
      4)选择确认选项

    可靠数据传输

    TCP的发送方有3个与发送和重传有关的主要事件:

    (1)、从上层引用程序接收数据。

    TCP从应用程序接收数据,将数据封装在报文段中,并把该报文段交给IP。每个报文段都有一个序号(报文段第一个数据字节的字节流编号)。若定时器还没为某些其他报文段运行,则当报文段被传给IP时启动该定时器。

    (2)、定时器超时。

    TCP通过重传引起超时的报文段来响应超时事件,然后TCP重启定时器

    (3)、收到ACK。

    TCP将ACK的值与它的变量sendbase(最早未被确认的字节序号)比较。TCP采用累积确认。ACK的值确认了字节编号在ACK之前的所有字节都已经收到。若ACK的值>sendbase,则该ACK是在确认一个或多个先前未被确认的报文段,因此发送方更新sendbase变量;若当前有未被确认的报文段,TCP还要重新启动定时器

    1、三种有趣的情况:


    2、超时时间加倍

    超时事件发生时,TCP重传具有最小序号的还未被确认的报文段,每次TCP重传时都会将下一次的超时间隔设为先前值的两倍。

    3、快速重传

    超时触发重传超时周期可能相对较长,当一个报文段丢失时,长超时周期迫使发送方延迟重传丢失的分组,增加了端到端时延。

    发送方可在超时事件发生之前通过注意冗余ACK来较好检测到丢包情况。当TCP接收方收到一个具有序号的报文段时,其序号大于下一个所期望的、按序的报文段,即有报文段丢失,因TCP不适用否定确认,故只是对已收到的最后一个按序字节数据进行重复确认(产生一个冗余ACK)。

    若TCP发送方接收到对相同数据的3个冗余ACK,说明跟在这个已被确认过3次的报文段之后的报文段已经丢失,TCP执行快速重传,即在该报文段的定时器过期之前重传丢失的报文段。



    TCP的差错恢复机制为GBN协议和SR协议的混合体:发送方仅需维持已发送但未被确认的字节的最小序号和下一个要发送的字节的序号(GBN)。TCP实现会将正确接收但失序的报文段缓存器起来(SR)。TCP接收方可有选择的确认失序报文段,而不是累积地确认最后一个正确接收的报文段。


    展开全文
  • 传输层:udp、tcp特点、与udp的区别、三次握手、四次挥手、为什么TCP可靠传输,哪些方法保证可靠

    传输层

    在这里插入图片描述

    1.传输层的作用

    传输层的作用是为应用层提供通信服务,使用网络层的服务。

    TCP/IP为上层应用提供了两个不同的运输层协议,即
    (1) 用户数据报协议(User Datagram Protocol,UDP),UDP在传输数据之前不需要建立连接
    (2)传输控制协议(Transport Control Protocol,TCP),TCP提供面向连接的服务

    传输层的复用和分用:

    复用(Multiplexing):在发送方不同的应用进程都可以使用同一个传输层协议传送数据(需要加上适当的首部)

    分用(Demultiplexing):指接收方的传输层在剥去报文的首部后能把这些数据正确交付到目的应用进程。
    多个程序同时发消息给一台电脑,电脑如何准确的把这些消息给到不同程序的端口?
    传输层从IP层收到数据后必须交付给指明的应用进程。传输层要正确的将数据交付给指定应用进程,就必须给每个应用进程赋予一个明确的标志。在TCP/IP网络中,使用一种与操作系统无关的协议端口号(Protocol Port Number)(简称端口号)来实现对通信的应用进程的标志。分用时,找不到对应的目的端口号,就给发送方发送ICMP“端口不可达”的差错报告报文。

    一、用户数据报协议(UDP)

    1.概述

    用户数据报协议UDP只在IP的数据报服务之上增加了有限的功能,这就是端口的功能(有了端口,传输层就可以进行复用和分用)和差错检测的功能。UDP用户数据报只能提供不可靠的交付,但是优点也是有的:

    1. UDP是无连接的,即发送数据之前不需要建立连接,结束也没有可释放的连接,因此减少了开销和发送数据之前的时延。
    2. UDP使用尽最大努力交付,即不保证可靠交付,同时也不使用流量控制和拥塞控制,因此主机不需要维持具有许多参数的、复杂的连接状态表
    3. 由于UDP没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低。适合实时会议等
    4. UDP是面向报文的,也就是应用程序交给UDP一个报文,UDP就发生一个报文,并不会将报文分组发送,所以应用程序得选择合适大小的报文。适合一次性传输少量数据的网络应用
    5. UDP支持一对一、一对多、多对一和多对多的交互通信
    6. 用户数据报只有8个字节的首部开销,比TCP的20个首部字节要短得多。

    2.UDP报文的首部格式

    在这里插入图片描述
    UDP报文有两个字段:数据字段和首部字段。首部字段很简单,只有8个字节,由4个字段组成,每个字段都是两个字节。
    (1)源端口 源端口号
    (2)目的端口 目的端口号
    (3)长度 UDP用户数据报的长度
    (4)检验和 差错检验码,防止UDP用户数据报在传输中出错

    UDP校验
    在这里插入图片描述
    伪首部只有在计算检验和时才出现,不向下传送也不向上递交
    17:封装UDP报文的IP数据包首部协议字段是17
    UDP长度:UDP首部8B+数据部分长度(不包括伪首部)

    二、TCP协议

    1.概念及特点

    TCP是传输控制协议,位于传输层。

    特点:

    • TCP是面向连接的传输层协议
    • 每一条TCP连接只能由两端点(IP地址、端口号),点对点的连接
    • TCP提供可靠交付的服务,不丢不重可靠有序
    • 提供全双工通信
    • 面向字节流。流指的是流入到进程或从进程流出的字节序列

    TCP和UDP 的区别:

    • TCP是面向连接的(传输前需建立连接),UDP是无连接的(传输前不需要建立连接)

    • TCP提供可靠的服务。通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付

      Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制

    • UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信

    • 每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信

    • TCP对系统资源要求较多,UDP对系统资源要求较少

    2.TCP—>报文段首部解析

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yk0PnL0p-1641972208637)(C:\Users\user\AppData\Roaming\Typora\typora-user-images\1641969730076.png)]

    TCP协议的报文段分为两段,分别是首部和数据两部分。TCP协议的核心主要是在首部,只有搞清楚首部个字段的意义,才能掌握TCP的工作原理。

    TCP报文段首部的前20个字节是固定的,后面又4N个字节是根据需要增加的选项(N必须为整数),因此TCP首部的最小长度是20字节。

    首部个字段的意义如下:

    • 源端口和目的端口:各占两个字节,与UDP一样,该字段定义了在主机中发送和接收该报文段的应用程序的端口号,用于传输层的复用和分用
    • 序号:占4个字节,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号,本字段表示本报文段所发送数据的第一个字节的序号
    • 确认号:期望收到对方下一个报文段的第一个数据字节的序号。若确认号为N,则证明到序号N-1为止的所有数据都已经正确收到
    • 数据偏移(首部长度):TCP报文段的数据起始处距离TCP报文段的起始处有多远,以4B为单位,即一个数值是4B
    • 紧急位URG:URG =1时,标明此报文段中有紧急数据,是高优先级的数据,应尽快传输,不在缓存中排队,配合紧急指针字段使用
    • 确认位ACK: ACK=1时确认好有效,在连接建立之后所有传送的报文都必须将ACK置为1
    • 推送位PSH:PSH=1时,接收方尽快交付接收应用进程,不在等到缓存填满再想上交付
    • 复位RST:RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立传输连接
    • 同步位SYN:SYN=1时,标明是一个连接请求/连接接收报文
    • 终止位FIN:FIN=1时,表明此报文段发送方数据已发送完毕,要求释放传输连接
    • 窗口:指的是发送本报文段的一方的接收窗口,即现在允许对方发送的数据量,根据接收方的窗口大小来限制/调整发送方传输数据的大小
    • 检验和:检验首部+数据,检验时要加上12B伪首部,第四个字段为6
    • 紧急指针:URG=1时才有意义,指出本报文段中紧急数据的字节数
    • 选项:最大报文段长度MSS、窗口扩大、时间戳、选择确认…

    3.TCP的连接建立(三次握手)

    加入运行在一台主机(客户)上的某一个进程想与另一台主机(服务器)上的一个进程建立一条连接 ,客户应用进程首先通知客户TCP,他想建立一个与服务器上某个进程之间的连接,客户中的TCP会用以下步骤与服务器中的TCP建立一条TCP连接:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XIBTsOk2-1641976597221)(C:\Users\user\AppData\Roaming\Typora\typora-user-images\1641973223189.png)]

    A统称为客户端,B统称为服务器端

    1.客户端发送连接请求报文段,不携带应用层数据

    ​ SYN=1,seq=x(随机) : 同步位SYN:SYN=1时,标明是一个连接请求/连接接收报文,seq是序号

    2.服务器端接收到连接请求报文,为该TCP连接分配缓存和变量,并向客户端返回确认报文段,允许连接,不携带应用层数据。因为TCP是全双工通信,所以客户端和服务器端都各自有两个缓存,作于发送和接收使用。

    ​ SYN=1,ACK=1,seq=y(随机),ack=x+1,x为连接请求中的seq,因为ack是期待下一次接收的报文段的第一个字节的序号,所以ack=x+1

    3.客户端为该TCP连接分配缓存和变量,并向服务器端返回确认的确认,可以携带数据

    ​ SYN=0,ACK=1,seq=x+1,ack=y+1

    了解:SYN泛洪攻击

    SYN泛洪攻击发生在OSI第四层,这种方式利用TCP协议的特性,就是三次握手。攻击者发送TCP SYN,SYN是TCP三次握手中的第一个数据包,而当服务器返回ACK后,该攻击者就不对其进行再确认,那这个TCP连接就处于挂起状态,也就是所谓的半连接状态,服务器收不到再确认的话,就会重复发送ACK给攻击者。这样更加会浪费服务器的资源。攻击者就对服务器发送非常大量的这种TCP连接,由于每一个都没法完成三次握手,所以在服务器上,这些TCP连接会因为挂起状态而小号CPU和内存,最后服务器可能死机,就无法为正常用户提供服务了。

    解决方法:SYN cookie

    预防半连接攻击,SYN-Cookie是一种有效的机制,它的基本原理非常简单,那就是“完成三次握手前不为任何一个连接分配任何资源”。

    有兴趣的可以自己去查找资料。

    4.TCP的连接释放(四次挥手)

    参与一条TCP连接的两个进程中的任何一个都能终止该连接,连接结束后,主机中的“资源”(缓存和变量)将被释放。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VzGM6nFs-1641976597222)(C:\Users\user\AppData\Roaming\Typora\typora-user-images\1641974878701.png)]

    A统称为客户端,B统称为服务器端

    1.客户端发送连接释放报文段,停止发送数据,主动关闭TCP连接。

    ​ FIN=1,seq=u

    FIN是终止位标志,当FIN=1时表明此报文段发送方数据已发送完毕,要求释放传输连接

    2.服务器端回复一个确认报文段,客户端到服务器这个方向的连接就释放了—半关闭状态

    ​ ACK=1,seq=v,ack=u+1

    ACK是确认位,seq取决于上一次发送到哪里,这里seq=v,那么服务器上一次发送的报文段最后一个字节为v-1

    客户端到服务器这边的连接释放了,不能再发送数据,但可以发送确认消息,但是服务器到客户端的连接并没有释放,所以还可以继续向客户端发送数据,这种现象就是半关闭状态

    3.服务器端发送完数据,就发出连接释放报文段,主动关闭TCP连接

    ​ FIN=1,ACK=1,seq=w,ack=u+1

    seq取决于在第二步之后发送了多少数据(如果在半关闭的状态下,服务器端没有发送过数据,那么seq=v)

    4.客户端回复一个确认报文段,在等到时间等待计时器设置的2MSL(最长报文段寿命)后,连接彻底关闭。

    ACK=1,seq=u+1,ack=w+1

    客户端的TCP并不能马上释放整个连接,还要再等待一个超时时间才能将整个连接释放。因为客户端的确认有可能丢失,这是服务器端会重传FIN报文段,在这段超时时间内,若客户端又收到服务器端重传的FIN报文段,客户端需要再次进行确认,收到客户端的最后确认,服务器端才能最终将整个连接释放。若等待的这段超时时间内没有收到服务器端的FIN报文段,客户端的TCP则向其应用进程报告,整个连接已经全部释放。

    5.为什么TCP可靠传输,哪些方法保证可靠

    1. 确认和重传机制
      建立连接时三次握手同步双方的“序列号 + 确认号 + 窗口大小信息”,是确认重传、流控的基础。
      传输过程中,如果Checksum校验失败、丢包或延时,发送端重传。

    2. 数据排序
      TCP有专门的序列号SN字段,可提供数据re-order

    3. 流量控制
      滑动窗口(之后再详细讲)和计时器的使用。TCP窗口中会指明双方能够发送接收的最大数据量,发送方通过维持一个发送滑动窗口来确保不会发生由于发送方报文发送太快接收方无法及时处理的问题。

    4. 拥塞控制
      TCP的拥塞控制由4个核心算法组成:
      慢启动(Slow Start)
      拥塞避免(Congestion avoidance)
      快速重传 (Fast Retransmit)
      快速恢复(Fast Recovery)

    展开全文
  • 一个TCP连接必须经过三次“对话”才能建立起来。 简述TCP/IP四层模型和OSL七层模型的概念,每一层的作用,这两个模型的区别是什么? TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来...

    TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议,即收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来。

    一、TCP/IP四层模型

    简述TCP/IP四层模型和OSL七层模型的概念,每一层的作用,这两个模型的区别是什么?

    TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。

    TCP/IP通讯协议各层的功能
    应用层应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等(在TCP/IP的五层参考模型中,应⽤层对应OSI参考模型的哪⼏层?)
    传输层提供了节点间的数据传送服务,如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。
    互连网络层负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。
    网络接口层(数据链路层)对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据

    OSI模型(OSI/RM,Open Systems Interconnection Reference Model,开放式通信系统互联参考模型),是国际标准化组织(ISO)提出的一个试图使各种计算机在世界范围内互连为网络的标准框架,简称OSI。

    OSI各层的功能
    层名称传输单位作用
    物理层比特流规定了激活、维持、关闭通信端点之间的机械特性、电气特性、功能特性以及过程特性。该层为上层协议提供了一个传输数据的物理媒体。在这一层,数据的单位称为比特(bit)。属于物理层定义的典型规范代表包括:EIA/TIA RS-232、EIA/TIA RS-449、V.35、RJ-45等。设备之间比特流的传输,物理接口,电气特性等
    数据链路层数据链路层在不可靠的物理介质上提供可靠的传输。该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。在这一层,数据的单位称为帧(frame)。数据链路层协议的代表包括:SDLC、HDLC、PPP、STP、帧中继等。将上层数据封装成帧,用MAC地址访问媒介,错误检测与修正
    网络层(Network Layer)负责对子网间的数据包进行路由选择。网络层还可以实现拥塞控制、网际互连等功能。在这一层,数据的单位称为数据包(packet)。网络层协议的代表包括:IP、IPX、RIP、OSPF等(路由选择协议位于网络层)。。提供逻辑地址(IP)、选路,数据从源端到目的端的传输
    传输层(Transport Layer)第一个端到端,即主机到主机的层次。传输层负责将上层数据分段并提供端到端的、可靠的或不可靠的传输。此外,传输层还要处理端到端的差错控制和流量控制问题。在这一层,数据的单位称为数据段(segment)。传输层协议的代表包括:TCP、UDP、SPX等。实现网络不同主机上用户进程之间的数据通信,可靠与不可靠的传输,传输层的错误检测,流量控制等
    会话层数据管理主机之间的会话进程,即负责建立、管理、终止进程之间的会话。会话层还利用在数据中插入校验点来实现数据的同,提供包括访问验证和会话管理在内的建立和维护应用之间通信的机制,如服务器验证用户登录便是由会话层完成的
    表示层(Presentation Layer)对上层数据或信息进行变换以保证一个主机应用层信息可以被另一个主机的应用程序理解。表示层的数据转换包括数据的加密、压缩、格式转换等,主要解决用户信息的语法表示问题,如加密解密
    应用层(Application LAyer)为操作系统或网络应用程序提供访问网络服务的接口,确定进程之间通信的性质以满足用户需要以及提供网络与用户应用

    OSI模型与TCP/IP协议的区别

    OSI模型是一个参考标准,解释协议相互之间应该如何相互作用。TCP/IP协议是美国国防部发明的,是让互联网成为了目前这个样子的标准之一。 OSI模型中没有清楚地描绘TCP/IP协议,但是在解释TCP/IP协议时很容易想到OSI模型。两者的主要区别如下:
    TCP/IP协议中的应用层处理OSI模型中的会话层、表示层和应用层的功能。
    TCP/IP协议中的传输层并不能总是保证在传输层可靠地传输数据包,而OSI模型可以做到。TCP/IP协议还提供一项名为UDP(用户数据报协议)的选择。UDP不能保证可靠的数据包传输。

    ARP与RARP协议(地址解析协议) 

    将MAC地址08:00:20:0A:8C:6D解析为IP地址192.168.0.1

    如图,ARP协议是把查询IP地址对应的MAC地址,而RARP是查询MAC地址对应的IP地址:

    TCP/IP协议中,传输层包括TCP和UDP,TCP和UDP都提供了面向连接的数据传输服务,其中,TCP提供的是不可靠的数据传输服务。

    在unix服务器http://www.openlab.com.cn上提供了基于TCP的时间服务应用,该应用使用port为13。创建连接到此服务器的语句是:Socket s = new Socket(“www.openlab.com.cn”, 13);

    创建一个TCP客户程序的顺序:

    1.建立socket;2. 获得I/O流;3. 对I/O流进行读写操作;4. 关闭I/O流;5. 关闭socket

    创建一个TCP服务程序的顺序:

    1.创建一个服务器socket;2. 从服务器socket接受客户连接请求;3.创建一个服务线程处理新的连接;4. 在服务线程中,从socket中获得I/O流;5.对I/O流进行读写操作,完成与客户的交互;6.关闭I/O流;7.关闭socket

    TCP报头
    TCP选项有哪些

    TCP首部选项字段多达40B,一些常用的字段有:

    1)选项结束字段(EOP,0x00),占1B,一个报文段仅用一次。放在末尾用于填充,用途是说明:首部已经没有更多的消息,应用数据在下一个32位字开始处
    2)无操作字段(NOP, 0x01),占1B,也用于填充,放在选项的开头
    3)MSS(最大报文段长度),格式如下:种类(1B,值为2),长度(1B,值为4),数值(2B)
    用于在连接开始时确定MSS的大小,如果没有确定,就用默认的(一般实现是536B)
    4)窗口扩大因子,格式如下:种类(1B,值为3),长度(1B,值为3),数值(1B)
    新窗口值 = 首部窗口值 * 2的(扩大因子)次方
    当通信双方认为首部的窗口值还不够大的时候,在连接开始时用这个来定义更大的窗口。仅在连接开始时有效。一经定义,通信过程中无法更改。
    5)时间戳(应用测试RTT和防止序号绕回)
    6)允许SACK和SACK选项

    二、网络连接:TCP三次握手和四次挥手

    两个主机通过三次通信可以建立TCP连接,使用完后,进行四次通信断开连接。我们通常形象地把它们叫做三次握手和四次挥手。

    1. TCP三次握手:

    客户端:我要和你建立连接

    服务端:你真的要和我建立连接么?

    客户端:我真的要和你建立连接,成功。

    TCP 连接如果两次握手会发生什么?

    为了防止已失效的连接请求报文突然又传送到了服务端,因而产生错误。客户端发出的连接请求报文并未丢失,而是在某个网络节点长时间滞留了,以致延误到链接释放以后的某个时间才到达 Server 。

    三次握手过程中的不安全性

    1. SYN洪泛攻击

    服务器处于SYN_Wait的状态:
    1)伪装的IP向服务器发送一个SYN请求建立连接,然后服务器向该IP回复SYN和ACK,但是找不到该IP对应的主机,当超时时服务器收不到ACK会重复发送。当大量的攻击者请求建立连接时,服务器就会存在大量未完成三次握手的连接,服务器主机backlog被耗尽而不能响应其它连接。即SYN泛洪攻击 (属于DOS的一种,发送大量的半连接请求,耗费CPU和内存资源,引起网络堵塞甚至系统瘫痪)

    当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击.在Linux下可以如下命令检测是否被Syn攻击

    netstat -n -p TCP | grep SYN_RECV

    防范措施:
    1、降低SYN timeout时间,使得主机尽快释放半连接的占用
    2、采用SYN cookie设置,如果短时间内连续收到某个IP的重复SYN请求,则认为受到了该IP的攻击,丢弃来自该IP的后续请求报文
    3、在网关处设置过滤,拒绝将一个源IP地址不属于其来源子网的包进行更远的路由

    2)当一个主机向服务器发送SYN请求连接,服务器回复ACK和SYN后,攻击者截获ACK和SYN。然后伪装成原始主机继续与服务器进行通信。

    2. DOS攻击(拒绝服务攻击)与DDoS(分布式拒绝服务攻击)
    DOS攻击利用合理的服务请求占用过多的服务资源,使正常用户的请求无法得到相应。

    常见的DOS攻击有计算机网络带宽攻击和连通性攻击。

    带宽攻击指以极大的通信量冲击网络,使得所有可用网络资源都被消耗殆尽,最后导致合法的用户请求无法通过。

    连通性攻击指用大量的连接请求冲击计算机,使得所有可用的操作系统资源都被消耗殆尽,最终计算机无法再处理合法用户的请求。

    3. 死亡值ping

    许多操作系统的TCP/IP协议栈规定ICMP包大小为64KB(网间控制报文),且在对包的标题头进行读取之后,要根据该标题头里包含的信息来为有效载荷生成缓冲区。
    ”死亡值ping”就是故意产生畸形的测试ping包,声称自己的尺寸超过ICMP上限,也就是加载的尺寸超过64KB上限,使未采取保护措施的网络系统出现内存分配错误,导致TCP/IP协议栈崩溃,最终接收方宕机。

    2. TCP 四次挥手

    客户端:我要和你断开连接

    服务端:好的,断吧。

    服务端:我也要和你断开连接

    客户端:好的,断吧。

    TIME_WAIT状态的作用

    1. 可靠终止TCP连接。如果最后一个ACK报文因为网络原因被丢弃,此时server因为没有收到ACK而超时重传FIN报文,处于TIME_WAIT状态的client可以继续对FIN报文做回复,向server发送ACK报文。

    2. 保证让迟来的TCP报文段有足够的时间被识别和丢弃。连接结束了,网络中的延迟报文也应该被丢弃掉,以免影响立刻建立的新连接。

    各个阶段的状态,为什么会出现大量timewait,为什么会出现大量close_wait)

    链接:

    三、关于TCP的粘包拆包

    概念

    假设 Client 向 Server 连续发送了两个数据包,用 packet1 和 packet2 来表示,那么服务端收到的数据可以分为三种情况:

    1. 接收端正常收到两个数据包,没有发生拆包和粘包的现象。

    2. 接收端只收到一个数据包,但是这一个数据包中包含了发送端发送的两个数据包的信息,这种现象即为粘包。这种情况由于接收端不知道这两个数据包的界限,所以对于接收端来说很难处理。

    3. 这种情况有两种表现形式,接收端收到了两个数据包,但是这两个数据包要么是不完整的,要么就是多出来一块,这种情况即发生了拆包和粘包。这两种情况如果不加特殊处理,对于接收端同样是不好处理的。

    原因:

    1. 要发送的数据大于TCP 发送缓冲区剩余空间大小,将会发生拆包。
    2. 待发送数据大于 MSS(最大报文长度),TCP 在传输前将进行拆包。
    3. 要发送的数据小于 TCP 发送缓冲区的大小,TCP 将多次写入缓冲区的数据一次发送出去,将会发生粘包。
    4. 接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包。

    为什么UDP不存在粘包 ?

    UDP 是基于报文发送的,UDP首部采用了 16bit 来指示 UDP 数据报文的长度,因此在应用层能很好的将不同的数据报文区分开,从而避免粘包和拆包的问题。

    而 TCP 是基于字节流的,虽然应用层和 TCP 传输层之间的数据交互是大小不等的数据块,但是 TCP 并没有把这些数据块区分边界,仅仅是一连串没有结构的字节流;另外从 TCP 的帧结构也可以看出,在 TCP 的首部没有表示数据长度的字段,基于上面两点,在使用 TCP 传输数据时,才有粘包或者拆包现象发生的可能。

    解决办法:

    由于TCP本身是面向字节流的,无法理解上层的业务数据,所以在底层是无法保证数据包不被拆分和重组的,这个问题只能通过上层的应用协议栈设计来解决,根据业界的主流协议的解决方案,归纳如下:

    消息定长:发送端将每个数据包封装为固定长度(不够的可以填充0),这样接收端每次接收缓冲区中读取固定长度的数据就自然而然的把每个数据包拆分开来。
    设置消息边界:服务端从网络流中按消息边界分离出消息内容。在包尾增加回车换行符进行分割,例如FTP协议。
    将消息分为消息头和消息体:消息头中包含表示消息总长度(或者消息体长度)的字段。
    更复杂的应用层协议比如 Netty 中实现的一些协议都对粘包、拆包做了很好的处理。

    TCP 滑动窗口

    窗口是缓存的一部分,用来暂时存放字节流。发送方和接收方各有一个窗口,接收方通过 TCP 报文段中的窗口字段告诉发送方自己的窗口大小,发送方根据这个值和其它信息设置自己的窗口大小。

    发送窗口内的字节都允许被发送,接收窗口内的字节都允许被接收。如果发送窗口左部的字节已经发送并且收到了确认,那么就将发送窗口向右滑动一定距离,直到左部第一个字节不是已发送并且已确认的状态;接收窗口的滑动类似,接收窗口左部字节已经发送确认并交付主机,就向右滑动接收窗口。

    接收窗口只会对窗口内最后一个按序到达的字节进行确认,例如接收窗口已经收到的字节为 {31, 34, 35},其中 {31} 按序到达,而 {34, 35} 就不是,因此只对字节 31 进行确认。发送方得到一个字节的确认之后,就知道这个字节之前的所有字节都已经被接收。

    TCP 流量控制

    流量控制是为了控制发送方发送速率,保证接收方来得及接收。接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。实际上,为了避免此问题的产生,发送端主机会时不时的发送一个叫做窗口探测的数据段,此数据段仅包含一个字节来获取最新的窗口大小信息。

    展开全文
  • 在进行Java网络编程时,我们经常通过TCP协议进行传输,把数据封装成报文传输,而报文的传输使格式化传输而TCP首部就决定了每一个消息的格式和类型。 TCP 首部格式 各个字段的作用与含义: a、源端口号和目的端口号...
  • ❓ 在浏览器地址栏输入一个 URL 后回车,背后发生了什么 解析 URL 浏览器封装 HTTP 请求报文 DNS 域名解析获取 IP 地址 建立 TCP 连接(长链接) 浏览器发送请求 负责传输的 IP 协议 使用 ARP 协议凭借 MAC 地址...
  • C#使用TCP/UDP协议通信并用Wireshark抓包分析数据

    千次阅读 多人点赞 2020-10-31 01:20:35
    目录一、控制台程序发送1)创建项目 本文章主要讲述使用 VS2019 编写 C# 程序 ...同时打开一个网络 UDP 套接字,向室友电脑或树莓派发送这 50 行消息。 接下来我们创建一个新的 C# 控制台程序。 1)创建项目
  • TCP/IP协议簇

    千次阅读 2022-01-09 13:09:36
    TCP/IP 参考视频:网络协议 TCP/IP 视频教程全集(23P)| 14 小时从入门到精通 一、概述:分层 七层模型:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层 ...双方都对应的一个或多个协议进
  • 字节跳动前端面试准备(

    千次阅读 2020-06-12 10:52:58
    原生开发(NativeApp开发):像盖房子一样,先打地基然后浇地梁、房屋结构、瓦、钢筋水泥、电路走向等,原生APP同理:通过代码从每页面、每功能、每效果、每逻辑、每步骤全部用代码写出来,层层,...
  • TCP发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。 校验和:TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程的任何变化。如果收到段的检验和...
  • TCP/IP和Http协议已经是老生常谈的话题了,也是每程序猿必备的网络通信基础,今天我们聊聊面试过程经常会出现的有关TCP/IP和Http协议的一些知识。本篇文章呢只是带大家了解一些关键的知识点,不会大篇幅的介绍...
  • 面试TCP/UDP协议

    千次阅读 2019-08-04 13:58:43
    运输层提供了进程间的逻辑通信,运输层向高层用户屏蔽了下面网络层的核心细节,使应用程序看起来像是在两运输层实体之间有一条端到端的逻辑通信信道。 正如以上所述,TCP/UDP协议主要是为通信的进程提供抽象的通信...
  • 近期一直在忙着上线测试,过程也梳理下日常通用的发布测试流程。 、计划制定阶段 产品经理: 确定需求范围,需求评审后提供PRD及原型。 研发、测试: 评估工作量,整理研发、测试计划。 产品、研发、...
  • TCP与UDP的区别及相关问题

    千次阅读 2020-06-20 18:45:28
    TCP连接只能2端点,故TCP不提供广播或多播服务。 TCP提供可靠交付,通过TCP连接传输的数据,无差错、不丢失、不重复、并且按序到达。 TCP是面向字节流的。虽然应用进程和TCP的.
  • 1、第一次握手:客户端给服务器发送一个 SYN 报文。 2、第二次握手:服务器收到 SYN 报文之后,会应答一个 SYN+ACK 报文。 3、第三次握手:客户端收到 SYN+ACK 报文之后,会回应一个 ACK 报文。 4、服务器收到 ACK ...
  • tcp/ip协议详解

    万次阅读 2021-06-03 15:50:50
    tcp/ip 四层模型,从上到下依次是应用层,传输层,网络层,网络接口层(数据链路层) http协议请求格式: 1. 请求行: 请求行包括请求方法、URL、协议版本,它们之间用空格分隔(所以我们输入的 URL ...
  • TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但消耗一个序号,发送TCP客户进程进入SYN-SENT 同步已发送状态。====A向B说:让我们建立连接吧。我发送的信息序号会从x开始。 ③B 收到 A 的连接请求报文后...
  • TCP协议

    2018-10-18 14:40:29
    、ISO七层网络模型及其功能展示 1、物理层: 比特流传输,对应网络的中继器、集线器、网线和HUB,传输单位为比特; 2、数据链路层: 提供介质访问、链路管理等;对应网络的网卡、网桥、交换机;传输单位为帧。...
  • 以太网帧、IP 帧、UDP/TCP帧、http 报文结构解析

    万次阅读 多人点赞 2018-11-16 23:18:26
    我们从 OSI/RM 参考模型入手,来看 OSI/RM 七层模型的每一层数据帧结构。 一 OSI/RM 结构 OSI 是不同制造商的设备和应用软件在网络进行通信的标准...OSI 体系结构定义了一个七层模型用于进行进程间的通信,并...
  • 图解TCP/IP详解(史上最全)

    千次阅读 2020-01-07 11:07:30
    、OSI参考模型 1.图示 2.OSI七层模型各自作用 应用层 为应用程序提供服务并规定应用程序通信的相关细节。包括文件传输、电子邮件、远程登录等协议。 表示层 将应用处理的信息转换为适合网络传输的格式...
  • C#使用TCP/UDP协议通信

    千次阅读 2021-11-18 19:22:51
    C#使用TCP/UDP协议通信1.控制台程序使用 UDP 通信创建项目单输出代码使用 UDP 通信发送...同时打开一个网络UDP 套接字,向另一台室友电脑发送这50行消息 创建项目 打开 VS2019 ,点击 “ 创建新项目 ” 进行条件筛
  • TCP/IP 网络数据传输之网络协议

    千次阅读 2016-10-20 09:57:30
    说起网络数据之间的交互,我们就必须明白下网络的分层,知道网络从后台到客户端看到的哪些步骤。 网络的七层分层 在实际手机端开发,我们主要是通过接口向后台请求数据,然后数据经过处理展示到手机...
  • TCP/IP(Transmite Control Protocol 传输控制协议/Internet Protocol网际协议)已成为计算机网络的一套...在应用TCP/IP协议的网络环境,为了唯一地确定台主机的位置,必须为TCP/IP协议指定三参数,即IP地址、
  • 目录 UDP首部 UDP-源端口号(Source Port) UDP-目标端口号...校验和计算计算UDP伪首部的理由 TCP首部格式 TCP-源端口号(Source Port) TCP-目标端口号(Destination Port) TCP-序列号(Sequence Numb...
  • 网络传输协议-tcp、ip、http简介

    千次阅读 2021-04-01 19:28:01
    OSI(Open System Interconnection)7层参考模型,是国际标准化组织(ISO)制定的一个用于计算机或通信系统之间互联的标准体系,是一个七层的、抽象的模型,不仅包含各种名词的抽象定义和概念,也包括,具体的协议...
  • 字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存的存放顺序(一个字节数据当然就无需谈顺序的问题了)。 其实大部分人在实际的开 发中都很少会直接和字节序打交道。唯有在跨平台以及网络...
  • tcp与udp!!!

    千次阅读 2020-09-28 21:05:32
    2. 每TCP 连接只能端点,每TCP 连接只能是点对点的(); 3. TCP 提供可靠交付的服务。通过 TCP 连接传送的数据,无差错、不丢失、不重复、并且按序到达; 4. TCP 提供全双工通信。TCP 允许...
  • 公众号关注「奇妙的 Linux 世界」设为「星标」,每天带你提升技术视野!今天分析的具体问题是『为什么 DNS 使用 UDP 协议』,DNS 作为整个互联网的电话簿,它能够将可以被人...
  • 层的数据叫做比特。 数据链路层(ARP协议、RARP协议):定义了如何让格式化数据以帧为单位进行传输,以及如何让控制对物理介质的访问。这层通常还提供错误检测和纠正,以确保数据的可靠传输。如:串口通信...
  • 字节跳动抖音 测试工程师 视频面试

    千次阅读 多人点赞 2020-07-08 06:12:12
    字节跳动2021提前批测试开发 ---------------------------------------面经1 2020-07-03-------------------------------------- 接口测试遇到的问题怎么解决 接口测试:测试系统组件间接口的测试,用于检测外部...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,345
精华内容 6,138
关键字:

tcp发送的数据体中要有一个数值字节

友情链接: lammps_widom_insertion.zip