TCP协议详解

一、TCP协议简介

TCP协议,即传输控制协议(Transmission Control Protocol),是一种面向连接的、可靠的、基于字节流的传输层通信协议。在因特网协议族中,TCP层是位于IP层之上,应用层之下的中间层。尽管IP层只能提供不可靠的包交换(只提供尽最大努力的交付服务),但是TCP协议能够为不同主机的应用层之间提供可靠的、像管道一样的连接,相当于一条全双工的可靠信道。


二、TCP协议的主要特点

(1)面向连接的

应用程序在使用TCP协议之间,必须先建立TCP连接;在传输完数据之后,必须释放已经建立的TCP连接。

(2)端到端的通信

每一条TCP连接只能有两个端点,只能是点对点的。因此TCP协议不提供广播或多播服务。

(3)提供可靠的交付服务

TCP协议能够确保传输数据的正确性,无差错、不丢失、不重复、并且按序到达。

(4)提供全双工通信

TCP协议提供双向的数据传输服务。TCP协议允许通信双方的应用进程在任何时候发送数据。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。

(5)面向字节流

TCP中的“流”是指流入到进程或从进程流出的字节序列。

(6)提供流量控制

TCP使用滑动串口可以实现流量控制,让发送方的发送速率不要太快,让接收方来得及接收。

(7)提供拥塞控制



三、TCP的连接

每条TCP连接都有两个端点,TCP的端点叫做套接字(socket)。套接字的定义如下:

套接字 socket = (IP地址:端口号)

每一条TCP连接唯一地被通信的两个端点所确定:

TCP连接 ::= {socket1,socket2} = {(IP1:port1),(IP2:port2)}


Berkeley套接字API主要函数如下图所示:



java在包java.net中提供了两个类Socket和ServerSocket,分别用来表示双向连接的客户端和服务端。



四、TCP报文段首部结构

TCP虽然是面向字节流的,但是TCP传输的数据单元却是报文段,叫做TCP报文段。


TCP报文段的首部格式如下图所示:



首部固定部分各字段意义如下:

(1)源端口

占2个字节,写入源端口。

(2)目的端口

占2个字节,写入目的端口。

(3)序号

占4个字节,序号范围是[0,2^32-1]。序号增加到2^32-1之后,下一个需要就又回到0。

在TCP连接中传输的字节流中的每一个字节都按照顺序编号。首部中的序号字段的值指的是本报文段所发送数据的第一个字节的序号


例如:

如果当前发送的报文段的序号字段值是301,发送的数据长度为200,那么下一个报文段的序号字段值则应该为501。

(4)确认号

占4个字节,是期望收到对方下一个报文段的第一个数据字节的序号


例如:如果B收到了A发送的报文段,序号字段值是401,数据长度为300(401~700),如果B正确收到了A发送的序号到700为止的数据,则B期望收到A的下一个报文段的序号则是701,于是B在发送给A的确认报文段中将确认号的值置为701。

(5)数据偏移

占4位(半个字节),它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远,即TCP报文段的首部长度。4位最大能表示的十进制数是15,数据偏移的单位是4字节,则TCP首部长度最大值是60字节。因为首部有20字节的固定首部,则选项长度最大是40字节。

(6)保留

占6位,保留为今后使用,应置为0。

(7)紧急URG

当URG=1时,表示该报文段中有紧急数据,应当尽快传送。

(8)确认ACK

仅当ACK=1时,确认号字段才有用。当ACK=0时,确认好无效。TCP规定在建立连接之后传送的所有报文段都必须把ACK直为1。

(9)推送PSH

当两个应用进程在进行交互式的通信时,如果发送方把PSH置为1,就表示希望接收方在收到该TCP报文段之后,应该立即交付给接收方的应用进程,而不是等到整个缓存满了再向上交付。

(10)复位RST

当RST=1时,表明TCP连接出现了严重的错误,必须释放连接,然后再重新建立连接。

(11)同步SYN

在建立连接时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。若对方同意建立连接,则应该在响应报文段中让SYN=1和ACK=1。

(12)终止FIN

用来释放一个连接,当FIN=1时,表示此报文段的发送方的所有数据都已经发送完毕,请求释放连接。

(13)窗口

占2个字节,取值范围[0,2^16-1]。窗口指的是发送此报文段的那方的接收窗口的大小(从报文段首部的确认号算起,到报文段末尾)。窗口值作为接收方让发送方设置其发送窗口的依据。

(14)检验和

占2个字节,用来检验报文段的首部和数据两个部分,在计算检验和时,需要在报文段首部加上12个字节的伪首部。

(15)紧急指针

占2个字节,仅当URG=1时有意义,紧急指针指明了报文段中紧急数据的末尾在报文段中的位置,指针位置之前是紧急数据,之后为普通数据。即使窗口为0式也可以发送紧急数据。

(16)选项

长度可变,最长40个字节。

(17)填充

为了在使用选项之后,使整个首部长度是4字节的整数倍。


五、TCP提供可靠传输的工作原理

可靠传输的条件有如下两个要求:

(1)传输信道不产生差错;

(2)传输数据能够正确按序接收到。又分为两个部分,一是传输的数据丢失之后能够正确传输,二是无论发生方以多快的速度发送数据,接收方总是来得及处理接收到的数据。


对于第一个要求,TCP采用三次握手来建立连接四次握手来释放连接,来保证建立的传输信道是可靠的。


对于第二个要求,TCP采用了连续ARQ协议(回退N,Go-back-N;超时自动重传)来保证数据传输不出差错,另外使用滑动窗口协议来保证接收方能够及时处理所接收到的数据。



----------------------------------------------------------------------------------------------------------------------------------------------------------------

参考文献:

1、传输控制协议-维基百科

     https://zh.wikipedia.org/wiki/%E4%BC%A0%E8%BE%93%E6%8E%A7%E5%88%B6%E5%8D%8F%E8%AE%AE

2、TCP传输协议的服务特点http://network.51cto.com/art/201006/204689.htm

3、TCP协议和UDP协议 http://dongruan00.iteye.com/blog/1825896

4、Berkeley套接字-维基百科 

https://zh.wikipedia.org/wiki/Berkeley%E5%A5%97%E6%8E%A5%E5%AD%97#.E5.A5.97.E6.8E.A5.E5.AD.97API.E5.87.BD.E6.95.B0

5、Linux Socket编程(不限Linux)http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html

6、TCP数据报首部 http://blog.chinaunix.net/uid-26413668-id-3408115.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/312844.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UDP协议详解

一、UDP协议简介 UDP协议,即用户数据报协议(User Datagram Protocol),是一个简单的面向数据报的传输层协议。UDP协议只在IP数据报服务商增加了很少一点的功能,就是复用和分用,以及差错检测的功能。 二、UDP…

冰雪奇缘,白色世界:四个IT人的四姑娘山双桥沟游记

去年9月初去了川西的稻城亚丁,体会了金色世界秋日童话,还写了一篇游记《从你的全世界路过-一群程序员的稻城亚丁游记》,也是得到了很多朋友和童鞋的点赞。今年11月初趁着周末的两天时间和朋友去了川西的四姑娘山,体会了白色世界冰…

TCP三次握手建立连接

一、三次握手的过程 TCP需要三次握手才能建立连接,整个过程如下图所示: 假设A运行的是TCP客户端进程,而B运行的是TCP服务端进程。最开始的时候两端的TCP进程都处于ClOSED(关闭)状态。 这时候,A主动打开连接…

[原]排错实战——通过对比分析sysinternals事件修复程序功能异常

缘起 最近,我们程序的某个功能在一台机器上不正常,但是在另外一台机器上却是正常的。代码是同一份,vs版本也一样(打的补丁也一样)。编译出来的程序在两台电脑上运行的结果就是不一样。惊不惊喜,意不意外&am…

[原]windbg调试系列——崩溃在ComFriendlyWaitMtaThreadProc

前言 这是几年前在项目中遇到的一个崩溃问题,崩溃在了ComFriendlyWaitMtaThreadProc()里。没有源码,耗费了我很大精力,最终通过反汇编并结合原代码才最终搞清楚了事情的来龙去脉。本文的分析是基于真实项目进行的,中间略去了很多反…

TCP四次握手释放连接

一、四次握手的过程 TCP需要三次握手才能建立连接,整个过程如下图所示: 假设A运行的是TCP客户端进程,而B运行的是TCP服务端进程。最开始的时候两端的TCP进程都处于ESTABLISHED(已建立连接)状态。 这时候,A…

开源WPF控件库MaterialDesignInXAML推荐

今天介绍一个开源的C# WPF开源控件库,非常漂亮,重点是开源哦WPF做桌面开发是很有优势的,除了微软自带的控件外,还有很多第三方的控件库,比如收费的Dev Express For WPF、Telerik For WPF等,及Github上开源免…

TCP连续ARQ协议和滑动窗口协议

TCP协议通过使用连续ARQ协议和滑动窗口协议,来保证数据传输的正确性,从而提供可靠的传输。 一、ARQ协议 ARQ协议,即自动重传请求(Automatic Repeat-reQuest),是OSI模型中数据链路层和传输层的错误纠正协议之…

ASP.NET Core 集成测试中模拟登录用户的一种姿势

不管哪种用户验证方式,最终都是在验证成功后设置 HttpContext.User ,后续处理环节通过 HttpContext.User 获取用户信息。如果能直接修改 HttpContext.User ,就能达到模拟登录的目的,而 ASP.NET Core 的中间件(middlewa…

【NServiceBus】什么是Saga,Saga能做什么

前言Saga单词翻译过来是指尤指古代挪威或冰岛讲述冒险经历和英雄业绩的长篇故事,对,这里强调长篇故事。许多系统都存在长时间运行的业务流程,NServiceBus使用基于事件驱动的体系结构将容错性和可伸缩性融入这些业务处理过程中。 当然…

数据一致性基本知识

在分布式系统中,我们经常提及CAP定理,即一致性(Consistency)、可用性(Availability)和分区容忍性(Partition tolerance)。在本文中,我们将对数据一致性这一知识进行基本回…

分享一次与SharpDX坑爹Bug刚正面的过程

和SharpDX坑爹的Variant刚正面几个月前我写了这篇文章《.NET中生成动态验证码》文章,其实里面藏着一个大坑。运行里面的代码,会发现运行的 gif图片并没有循环播放: 细心的网友也注意到了这个问题:……但后来他备注说“已解决”&am…

EF Core 3.0查询

随着.NET Core 3.0的发布,EF Core 3.0也随之正式发布,关于这一块最近一段时间也没太多去关注,陆续会去对比之前版本有什么变化没有,本节我们来看下两个查询。分组我们知道在EF Core 3.0版本之前,对于分组查询是在客户端…

经典排序算法(1)——冒泡排序算法详解

冒泡排序(Bubble Sort)是一种典型的交换排序算法,通过交换数据元素的位置进行排序。 一、算法基本思想 (1)基本思想 冒泡排序的基本思想就是:从无序序列头部开始,进行两两比较,根据…

C++模版和C#泛型求同存异录(一)sizeof(T)

sizeof(T)从C的模板代码往C#代码移植的时候发现了一个小问题。在C模板代码中 sizeof(T)是一种有效的写法,最终在会编译器展开成sizeof(int),sizeof(float)或者sizeof(myclass),然后在运行时这个代码是有效的,能够执行的。于是我们看上去就可以计算在运行…

经典排序算法(2)——快速排序算法详解

快速排序(Quick Sort)也是一种典型的交换排序算法,通过交换数据元素的位置进行排序。 一、算法基本思想 (1)基本思想 快速排序的基本思想就是:通过一趟排序将要排序的数据分割成独立的两部分,其…

经典排序算法(3)——直接插入排序算法详解

直接插入排序(Insertion Sort)是一种插入排序算法,通过不断地将数据元素插入到合适的位置进行排序。 一、算法基本思想 (1)基本思想 直接插入排序的基本思想是:顺序地把待排序的序列中的各个元素按其关键字…

[ASP.NET Core 3框架揭秘] 异步线程无法使用IServiceProvider?

标题反映的是上周五一个同事咨询我的问题,我觉得这是一个很好的问题。这个问题有助于我们深入理解依赖注入框架在ASP.NET Core中的应用,以及服务实例的生命周期。一、问题重现我们通过一个简单的实例来模拟该同事遇到的问题。我们采用极简的方式创建了如…

经典排序算法(4)——折半插入排序算法详解

折半插入排序(Binary Insertion Sort)是一种插入排序算法,通过不断地将数据元素插入到合适的位置进行排序,在寻找插入点时采用了折半查找。 一、算法基本思想 (1)基本思想 折半插入排序的基本思想是&#x…

经典排序算法(5)——希尔排序算法详解

希尔排序(Shell Sort)是一种典型的插入排序算法,通过对原始序列进行分组进行排序。 一、算法基本思想 (1)基本思想 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的…