传输控制协议TCP(Transmission Control Protocol)
- 专门为了在不可靠的互联网络上提供可靠的端到端字节流而设计
- TCP必须动态地适应不同的拓扑、带宽、延迟、分组大小和其它的参数,并且当有错误的时候,能够足够健壮
支持TCP的机器都有一个
TCP实体
,或者是用户进程或者是操作系统内核,都可以管理TCP流和跟IP层的接口
发方:封装→TCP实体接收本地进程的用户数据流,将其分割成不超过64kB的分片(实践中,通常分割成1460字节,以通过以太网传输)
收方:解封装→当包含TCP数据段的报文到达某台机器的时候,被提交给传输实体,传输实体将其重构出原始的字节流
- TCP连接上的每个字节都有它自己独有的32位序列号
- 收发双方的TCP实体以数据段的形式交换数据
- 一个数据段包括20字节的头部(不包括可选项)和数据域(0或更多字节)
TCP数据段
TCP软件决定数据段的大小,有两个因素限制了数据段的长度:
- TCP数据段必须适合IP的65515的载荷限制
- 每个TCP数据段必须适合于下层网络的最大传输单元MTU(例如以太网载荷大小1500字节)
- TCP使用的基本协议具有动态窗口大小的滑动窗口协议(sliding window protocol)
数据段格式
-
源端口(Source port)和目的端口(Destination port)
:标明了一个连接的两个端点,用来跟踪同一时间内通过网络的不同会话,一般每个端口对应一个应用程序 -
序列号(Sequence number)
:表示一个字节的编号,可以说每一个字节都有一个序列号,其中有一个非常特殊的序列号叫
初始序列号(简称ISNs)
,
它是随机产生的 -
确认号(Acknowledgement number)
:期望接收的对方发过来的字节编号,在TCP里为了保证数据的可靠传递,采用了肯定确认机制、累计确认技术,这个时候就要用到确认号(例如确认号是500,就表示收到了发方发出的499、498等序列号的字节,下一次发方就可以从序列号为500的字节发数据过来) -
TCP段头长度(TCP header length)
:4字节,含义跟IP的段头长度一样 -
保留字段
(图片中灰色部分)
:如其名,不过现在也逐步启用,例如用来做一些拥塞控制等等 -
URG~FIN
:6个控制比特(每个都用1bit表示) -
窗口尺寸(Window size)
:告诉对方可以发送的数据字节数(从确认字节号开始连续发送的字节总数),窗口尺寸的大小取决于接收方 -
校验和(Checksum)
:和UDP中一样 -
紧急指针(Urgent pointer)
:和URG控制位配合使用 指明了紧急数据
控制比特URG-FIN
-
URG:当紧急指针使用的时候,URG被置为1,而紧急指针是一个对于当前序列号的字节偏移量,标明紧急数据从哪里开始
- ACK:1表示确认号有效,0表示确认号无效
- PSH:表示这是带有PUSH标志的数据,接收方收到这样的数据,应该立刻送到上层,而不需要缓存它
- RST:被用来重置一个已经混乱的连接
-
SYN:用在连接建立的过程里面,通常SYN和ACK一起指示了连接建立的某个环节
- FIN:被用来释放连接,表示发送方已经没有数据要传输,但是可以继续接收数据
版权声明:本文为Jaihk662原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。