TCP通过哪些措施,保证传输可靠

本文详细介绍了TCP如何通过数据包截断、超时重发、校验、失序数据重新排序及流量控制等机制来实现可靠的数据传输。同时,还解释了TCP面向连接的特点及其提供的字节流服务。

TCP是通过什么方式来提供可靠传输的 (合理截断数据包,超时重发,校验,失序重新排序,能够丢弃重复数据,TCP可以进行流量控制)

TCP提供一种面向连接的可靠的字节流服务。 

面向连接:意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。在一个TCP连接中,仅有两方进行彼此通信。广播多播不能用于TCP。
 
TCP通过下列方式来提供可靠性:
1、应用数据被分割成TCP认为最适合发送的数据块。这和UDP完全不同,应用程序产生的数据报长度将保持不变。        (将数据截断为合理的长度)
2、当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。      (超时重发)
3、当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒。
          (对于收到的请求,给出确认响应)           (之所以推迟,可能是要对包做完整校验)
4、TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。
      如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段。       (希望发端超时并重发)      (校验出包有错,丢弃报文段,不给出响应,TCP发送数据端,超时时会重发数据)
5、既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。
      如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。           (对失序数据进行重新排序,然后才交给应用层)           
6、既然IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。              (对于重复数据,能够丢弃重复数据)        
7、TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。
      TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。               (TCP可以进行流量控制,防止较快主机致使较慢主机的缓冲区溢出)
TCP使用的流量控制协议是可变大小的滑动窗口协议。

字节流服务:两个应用程序通过TCP连接交换8bit字节构成的字节流。TCP不在字节流中插入记录标识符。我们将这称为字节流服务(bytestreamservice)。
TCP对字节流的内容不作任何解释:TCP对字节流的内容不作任何解释。TCP不知道传输的数据字节流是二进制数据,还是ASCII字符、EBCDIC字符或者其他类型数据。对字节流的解释由TCP连接双方的应用层解释。 
 
 
转自:http://blog.youkuaiyun.com/hbhhww/article/details/8216541
### TCP协议确保数据可靠传输的原理 TCP协议设计了一系列机制来保障数据在网络中的可靠传输。这些机制共同作用,使得即使在不可靠的互联网环境中也能提供可靠的字节流服务。 #### 面向连接的服务建立 为了保证通信双方能够有效地交换信息,在正式传送应用层消息之前,TCP会先通过三次握手过程建立起一条虚拟电路[^1]。这不仅验证了两端设备的存在状态,还同步了初始序列号和其他必要的参数设置,为后续的数据交互奠定了基础。 #### 序列化与确认应答机制 每一个被发送出去的数据段都会携带一个唯一的序号,该序号反映了此分组在整个报文中所处的位置。接收者收到数据后需返回ACK(Acknowledgment)给发件人作为回应;如果某个特定编号的消息未能按时得到确认,则认为其可能已丢失,此时源节点将重新发送相应的数据片段直至成功为止[^3]。 #### 流量控制策略 为了避免过载现象的发生以及提高资源利用率,TCP采用了基于滑动窗口算法来进行流量管理的方法。这种方式允许接收端告知发送端当前可用缓存容量大小的信息,进而动态调整每次可接受的最大字节数目。如此一来既不会因为过度快速而造成丢包也不至于因太慢影响效率[^2]。 #### 错误检测功能 校验和字段用于检验整个头部加上有效负载是否存在任何位级差错。一旦发现异常情况就会触发重传操作以修复受损的内容。除此之外还有超时计时器用来监控每条记录的状态变化趋势,对于长时间未响应的数据项也会启动恢复流程。 ```python import socket def create_tcp_socket(): """创建一个TCP套接字""" sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) return sock sock = create_tcp_socket() server_address = ('localhost', 8080) try: # 发起连接请求 sock.connect(server_address) message = b'This is the message.' amount_expected = len(message) while True: data_sent = sock.sendall(message) # 发送全部数据 received_data = [] amount_received = 0 while amount_received < amount_expected: more_data = sock.recv(16) # 接收部分数据 if not more_data: break received_data.append(more_data.decode()) amount_received += len(more_data) joined_data = ''.join(received_data) print(f'Received {joined_data}') finally: sock.close() # 关闭socket连接 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值