【问题标题】:can TCP really guarantee delivery?TCP真的能保证交付吗?
【发布时间】:2017-06-17 01:09:04
【问题描述】:

我正在阅读一本网络书籍,根据我阅读的有关 TCP 协议的内容,它确保数据将被发送。我想编写一些代码来进行文件传输。在开始之前,我还在 Python 文档中读到了这段话:

“应用程序负责检查所有数据是否已 发送;如果只传输了部分数据,应用程序需要 尝试传递剩余数据”

这似乎与我在网络书籍中读到的内容相矛盾。上面的段落说应用程序对丢失的数据负责。

我可能是误会了,所以我想问一些问题:

1-如果我必须检查数据是否发送,那为什么要使用 TCP?

2-我在网络书籍中读到 TCP 进行数学运算以确保数据存在。那为什么不使用 TCP 是浪费时间呢?

3- python 文档没有指定缓冲区大小。一次发送的最大缓冲区大小是多少?

4-我在网络书上看到服务器可以增加量 如果它知道客户端可以接收它可以发送的数据。这能改变吗 缓冲区的大小超过最大数量?

到目前为止,这是我的代码尝试:

服务器代码:

import socket
s = socket.socket()
host =  socket.gethostname()
port =  3000
s.bind((host,port))
s.listen(1)
c,addr = s.accept()
with open("Filetosend","rb") as File:
    data=  File.read(1024)
    while data:
        c.send(data)
        data =  File.read(1024)
s.close()

客户端代码:

import socket
s= socket.socket()
host =  socket.gethostname()
port =  3000
s.connect((host,port))
with open("Filetowrite","wb") as File:
    data =  s.recv(1024)
    while data:
        File.write(data)
        data = s.recv(1024)
s.close()

【问题讨论】:

    标签: python sockets tcp


    【解决方案1】:

    TCP 试图保证如果数据被传递,它是正确且有序的。它使用校验和来确保数据不被破坏,并使用序列号来确保数据按顺序传递并且没有间隙。它使用确认,因此发送者将知道数据已被接收。

    但假设在传输过程中出现网络故障。如果它发生在收到数据段之后,但在回送确认之前,发送方将不知道数据已收到。发送方会不断尝试重新发送数据,最终会超时并向应用程序报告错误。

    大多数 TCP API 不允许应用程序准确找出通信中发生错误的位置。如果您发送了一个兆字节并收到错误,它可能发生在开始时,几乎没有发送任何内容,或者在发送大部分数据时结束。它甚至可能发生在所有数据发送之后——也许只是最后一个 ACK​​ 丢失了。

    此外,write() 系统调用通常只是将数据放入内核缓冲区。它不等待数据发送到网络,也不等待接收者确认。

    即使你成功关闭了连接,你也不能完全确定。当您关闭连接时,发件人会向收件人发送一条消息,说明他们已完成发送数据。但是关闭连接只是在网络堆栈中排队,它不会等待其他系统确认它。

    这就是为什么应用程序协议在基本 TCP 协议之上具有自己的确认级别的原因。例如,在 SMTP 协议中,客户端发送消息内容,后跟一行带有. 的行表示结束,然后等待服务器发回响应码,表示消息接收成功,正在交付或排队。 TCP 的检查确保如果您收到此响应,则消息内容已完整发送。

    关于任何协议保证所有消息完美传递的一般能力,您应该阅读Two Generals' Problem. 无论您做什么,都无法在任何通信中验证所有消息的传递,因为唯一的方法是通过发送另一条回复消息来确认最后一条消息已送达,现在该回复是最后一条消息,需要确认。

    【讨论】:

    • 值得一提的是系统write ()调用的行为,它并不能保证整个缓冲区都会被发送。我有一种强烈的感觉,提到的文档指的是这个。
    猜你喜欢
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    • 2012-01-28
    • 1970-01-01
    相关资源
    最近更新 更多