Networking TCP是在每个数据包上发送SYN/ACK还是仅在第一次连接上发送SYN/ACK?

Networking TCP是在每个数据包上发送SYN/ACK还是仅在第一次连接上发送SYN/ACK?,networking,tcp,udp,client-server,packet,Networking,Tcp,Udp,Client Server,Packet,我有一个TCP服务器,它监听传入的客户端,然后每秒向它发送一个数据包。我想知道,SYN/ACK数据包是否只在初始连接时发送,所以看起来是这样的: <client connect> SYN ACK DATA DATA DATA <client disconnect> SYN 阿克 资料 资料 资料 还是每一个包裹都会被发送,就像这样 <client connect> SYN ACK DATA SYN ACK DATA SYN ACK DATA <

我有一个TCP服务器,它监听传入的客户端,然后每秒向它发送一个数据包。我想知道,SYN/ACK数据包是否只在初始连接时发送,所以看起来是这样的:

<client connect>
SYN
ACK
DATA
DATA
DATA
<client disconnect>

SYN
阿克
资料
资料
资料
还是每一个包裹都会被发送,就像这样

<client connect>
SYN
ACK
DATA

SYN
ACK
DATA

SYN
ACK
DATA
<client disconnect>

SYN
阿克
资料
SYN
阿克
资料
SYN
阿克
资料
另外,如果是第一种情况,如果您只是长时间保持连接打开,UDP over TCP有什么好处吗?

有点像:

+-------------------------------------------------------+
|     client           network            server        |
+-----------------+                +--------------------|
|    (connect)    | ---- SYN ----> |                    |
|                 | <-- SYN,ACK -- |     (accepted)     |
|   (connected)   | ---- ACK ----> |                    |
\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/

when client sends...
\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/
|                 |                |                    |
|     (send)      | ---- data ---> |                    |
|                 | <---- ACK ---- |  (data received)   |
\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/

when server sends...
\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/
|                 |                |                    |
|                 | <--- data ---- |       (send)       |
| (data received) | ---- ACK ----> |                    |
\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/

...and so on, til the connection is shut down or reset
+-------------------------------------------------------+
|客户端网络服务器|
+-----------------+                +--------------------|
|(连接)|--SYN-->|
|                 |  |                    |
\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/
当客户端发送。。。
\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/
|                 |                |                    |
|(发送)|----数据-->||

||SYN仅处于开始阶段

ACK位于任一方向的后续段上。ACK还将定义窗口大小。例如,如果窗口大小为100,发送方可以在预期接收ACK之前发送100个段。例如,如果发送方发送100段,但段号50丢失,则接收方将获得1-49和51-100。然后,接收器将确认50(它期望的下一段),并将窗口大小设置为1。发送方将重新发送序列号为50的1段。然后,接收器将确认101,并将窗口大小设置回更高的数字

这两个字段实际上都是TCP报头中的字段,可以与数据一起发送,尽管SYN和第一个ACK通常都是无数据的

因此,您描述的两种情况都不完全正确。第一个实际上更接近现实,但是SYN之后的所有数据包都必须包括ACK,以及一个确认号字段,该字段标识预期的下一个数据包的编号

会话的结束还涉及到与FIN标记的数据包以及与之相关的ACK进行握手

交换的序列号用于识别丢失的数据包并启用重试机制,还用于以正确的顺序重新组合整个数据包流

另外,如果是第一种情况,如果您只是长时间保持连接打开,UDP over TCP有什么好处吗

使用UDP,您不能长时间保持连接打开。没有联系

SYN/ACK/FIN标志序列是连接的组成部分

使用UDP时,没有SYN或ACK,因此通信是单向的,无法保证传递,也无法保留顺序。但它的开销较小,所以在速度比可靠性更重要的情况下,它很有用,例如在流媒体中

这是一个有点简化了,但它是我目前能做的最好的

在RFC中,当然还有更多关于这方面的内容。

请想象一下: 最初的TCP标准RFC793允许使用第一个SYN数据包发送数据。然而,今天的情况并非如此。在连接请求者发起三方握手期间,您得到的是一个单独的SYN数据包。假设A请求与B连接,因此A发送一个带有SYN位集的数据包。B用确认接收的ACK响应,并发送ACK+SYN数据包。此后可以传输数据


确认可能会变得复杂。它不是针对每个数据包,而是针对接收到的数据包,因此每8个数据包可能有一个ACK。发送端有一个窗口,该窗口显示在必须接收ACK之前将发送多少信息。然后是选择性确认,用于表示“已接收字节2000-8000,但不是0-2000”。用户数据报协议通常用于查询响应协议中,其中对查询的响应将证明已接收到查询,并且,缺少重复查询将向响应者证明,要么它的响应已被接收,要么查询的发起人已放弃(响应者不在乎是哪一个,因为它在任何情况下的正确响应都是不做任何进一步的事情)。TCP/IP中没有“数据包”。请参阅此处的正确术语:@Phillips-TCP是一种IP分层协议。在TCP处理之前,没有段的概念。在这个过程中,将传入数据称为数据包而不是数据段是完全可以接受的,因为在这种情况下,它们毕竟只是IP数据包。作为IP数据包进入TCP,以段、消息等形式出现。除了阅读维基百科和RFCs之外,我还推荐W.Richard Stevens的《TCP/IP图解,第1卷-协议》一书。这对大脑来说有点容易:)发送方将重新发送序列号为50的1段。因为最后收到的数据段是50段,所以接收器将确认101段,不是吗?我不理解关于“通信是单向的”的评论。这毫无意义。UDP只是IP上一个非常薄的普通层,因为它只是IP,上面有少量巧克力酱,所以您可以向两个方向发送UDP数据包。如果设计师选择使用UDP,则这样做是为了获得更高的速度性能并最大限度地减少交换的流量,或者,它允许对通信方法进行完全控制。如果需要,设计者可以使用UDP构建一种完全自由选择的新协议。某些应用程序可能不需要可靠的交付、顺序交付保证或TCP或SCTP等协议提供的其他好处。但是,如果使用UDP,使应用程序代码复杂化或最终发明了自定义协议,设计者可能需要做更多的设计工作。@RafaelEyng否,因为51-100段缓冲在接收器的端口上
\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/
|                 |                |                    |
|                 | <--- data ---- |       (send)       |
| (data received) |                |                    |
|     (send)      | -- data,ACK -> |                    |
|                 |                |  (data received)   |
|                 | <- data,ACK -- |       (send)       |
| (data received) |                |                    |
|  (wait a bit)   | <--- data ---- |       (send)       |
| (data received) |                |                    |
|     (send)      | -- data,ACK -> |                    |
|                 |                |  (data received)   |
|     (send)      | ---- data ---> |   (wait a bit)     |
|                 |                |  (data received)   |
|                 | <- data,ACK -- |       (send)       |
| (data received) |                |                    |
|  (wait a bit)   |   (dead air)   |                    |
|                 | ---- ACK ----> |                    |
\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/