TCP/IP学习笔记16--TCP--特点,数据重发,连接管理,段
TCP充分实现了数据传输时各种控制功能,可以进行丢包时的重发控制,还可以对次序乱掉的包进行顺序控制,这些在UDP中都是没有的。UDP是一种没有复杂控制,提供面向无连接通信服务的一种协议。TCP是面向有连接的通信协议,只有在取人对端存在的情况下才会发送数据,从而可以控制通信流量的浪费。
知识点1:TCP通过序列号和确认应答提高可靠性:
在 TCP中当发送端的数据到达接受主机时,接收主机会返回一个已经收到消息的通知,这个消息叫做确认应答(ACK)。ACK中携带着一个信息:告诉发送端下一个应该发的包的序号。

如果发送端在一定时间内没有等到对端已经收到消息的ACK,则会认为数据已经丢失了,会进行重发,保证数据的可靠性。
发送端未收到ACK并不一定意味着数据没有被接收端接受到,也可能是接收端已经接受到,只是返回的ACK在中途丢失了。在这种情况下,发送端同样认为没有发送成功,照样会重新发送数据。

在这种情况下,接收端主机可能会连续不断地接受到相同的数据包,因此需要引入一种机制来判断在接收端是否已经收到了数据,如果收到了且又来了相同的数据,那么就没有必要重复处理了。
知识点2:重发超时如何确定:
发送端发送一个数据包之后,等待接收端返回ACK,需要确定一个时间阈值,当超过这个时间接收端仍然没有收到ACK,发送端就重新发一次刚刚发送的数据。 这个重发超时如何确定呢?
最理想的情况是找到一个最小时间,它能保证ACK一定能在这个时间内返回。然而,这个时间随着数据包途径的网络环境的不同而有变化,例如在告诉的LAN中时间会较短。即使在同一个网络中,根据不同时段的网络的拥堵程度,时间的长短也会发生变化。
TCP在每次发包时都会计算往返时间(RTT, Round Trip Time),以及其偏差(类似方差的概念)。 将RTT与偏差相加得到 重发超时的时间。

上图中的虚线表示计算出来的重发超时的时间阈值。
在BSD的 UNix以及Windows系统中,超时都是以0.5秒为单位进行控制的,都是其整数倍。不过,由于最初的数据包还不知道往返时间,所以重发超时一般设置为6s左右。
另外,数据被重发之后,如果还是收不到确认应答,则进行再次发送,此时,等待确认的应答时间将会以2倍,4倍的指数函数增长。 当达到一定的重发次数后,如果仍然收不到ACK, 就会判断网络或接收端主机发生了异常,则强制关闭连接,并通知应用层程序: 通信异常强行终止。
知识点3:TCP连接的建立与断开:
在数据通信前,客户端会先向服务器发送一个SYN(请求建立连接包),如果对端发来确认应答,则认为可以进行数据通信。
客户端在通信结束时,会向服务器发送一个FIN(请求断开连接包)。 具体的流程如下所示:

TCP以段为单位发送数据:
TCP发送数据时,是将数据拆分成一个个的包发送的,每个包的长度称为“最大消息长度”(MSS: Maximum Segment Size)。最理想的情况是MSS的大小等于 IP层中不会被分片处理的最大数据长度,因为TCP发出的数据包,到达下一层IP层后,如果其大小大于IP层的单个数据包的最大长度,则IP层会拆它!
MSS是在建立连接时,三次握手的时候被计算出来的!(怪不得需要 三次握爪)
两端的主机在发出建立连接的请求时,会在TCP首部中写入MSS值,告诉对端自己的接口能够适应的MSS的大小,然后会在两者之间选择一个较小的值使用:
Ref:
《图解TCP/IP》--竹下隆史 6.4章节
TCP/IP学习笔记16--TCP--特点,数据重发,连接管理,段的更多相关文章
- TCP/IP学习笔记:TCP传输控制协议(一)
1 TCP的服务 尽管TCP和UDP都使用相同的网络层(IP),TCP却向用户提供一种面向连接的,可靠地字节流服务.两个使用TCP的应用,在彼此交换数据之前必须先建立一个TCP连接,在一个TCP连接中 ...
- tcp/ip学习笔记-TCP
tcp/ip学习笔记-TCP 彭会锋 报文发送采用的是tcp_output函数,
- tcp/ip学习笔记(1)-基本概念
为什么会有tcp/ip 在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣经中上帝打乱了各地人的口音,让他们无法合作一样.计 ...
- TCP/IP学习笔记(3)-IP、ARP、RARP协议
这三个协议放到一起学习是因为这三个协议处于同一层,ARP协议用来找到目标主机的Ethernet网卡Mac地址,IP则承载要发送的消息.数据链路层可以从ARP得到数据的传送信息,而从IP得到要传输的数据 ...
- TCP/IP学习笔记(5)------IP选路
静态IP选路 一个简单的路由表 选路是IP层最重要的一个功能之一.前面的部分已经简单的讲过路由器是通过何种规则来根据IP数据包的IP地址来选择路由.这里就不重复了.首先来看看一个简单的系统路由表. D ...
- TCP/IP学习笔记(3)----IP,ARP,RARP协议
把这三个协议放到一起学习是因为这三个协议处于同一层(网络层协议),ARP协议用来找到目标主机的Ethernet网卡Mac地址,IP则承载要发送的消息.数据链路层可以从ARP得到数据的传送信息,而从IP ...
- TCP/IP学习笔记17--TCP-- 窗口控制 重发控制 流控制
事业无穷年 -- 韩愈 利用窗口控制提高速度: TCP传输数据是,以一个段为单位(每次发送一个数据包),每发一个段需要一次确认应答,这样就难免存在这样的缺点:包的往返时间越长,通信性能就越低. 为解决 ...
- TCP/IP学习笔记13--IP地址的构成,广播地址,IP多播,子网掩码
现在,我是蔚蓝的 :在此岸或彼岸,我都是蔚蓝的. ---李瑾 IP对应的是OSI模型中的网络层,TCP对应的是传输层.每一个参与通信的主机都会有一个IP地址. IP地址(IPv4地址)含4个字节,每 ...
- TCP/IP学习笔记(2)-数据链路层
数据链路层有三个目的: 为IP模块发送和接收IP数据报. 为ARP模块发送ARP请求和接收ARP应答. 为RARP发送RARP请求和接收RARP应答 ip大家都听说过.至于ARP和RARP,ARP叫做 ...
随机推荐
- 长为N的数组,元素范围是0-N-1,其中只有一个数是重复的,找出这个重复元素
思路:如果限制空间复杂度为O(1),我们就无法采用哈希表的方法去求解.题目中数组中所以数字都在范围[0, N-1],因此哈希表的大小为N即可.因此我们实际要做的就是对N个范围为0到N-1的数进行哈希, ...
- python的程序运行时间
import time start =time.clock() sum= ,): sum=sum+i print(sum ) end = time.clock() print('Running tim ...
- C++报错:全局变量重定义或是多次定义
如何在C++中定义全局变量时避免重复定义呢? 只要在定义时尽量在.cpp文件中进行,而不要在.h 文件中定义,定义好了之后,可以在.h文件中利用extern关键字进行声明. 如果在.h文件中定义的话, ...
- if语句的嵌套:从键盘输入3个实数,求其最大值。
#include<stdio.h>void main(){ float a,b,c,max; scanf("%f%f%f",&a,&b,&c); ...
- springboot使用jpa案例
1 创建entity实体类并生成数据库表 @Entity @Table(name="student") public class Student { @Id @GeneratedV ...
- webpack的loader的原理和实现
想要实现一个loader,需要首先了解loader的基本原理和用法. 1. 使用 loader是处理模块的解析器. module: { rules: [ { test: /\.css$/, use: ...
- MySQL 分库分表 dble简单使用
一.运行环境 Host Name IP DB Mod data0 172.16.100.170 mysql data1 172.16.100.171 mysql data2 172.16.10 ...
- AnsiString
原文链接:https://blog.csdn.net/Li_Ning_/article/details/82981092 /* * 编号:Number 1 * 函数:substring * 说明:截取 ...
- 关于java项目跑着跑着就挂掉的问题
部署项目后,安装redis,从redis中获取数据,或一些数据库查询操作,服务器cpu和内存占用率突增.
- bootstrap轮播图组件
一.轮播图组件模板(官方文档) <div id="carousel-example-generic" class="carousel slide" dat ...