传输控制协议TCP的特点

1.TCP面向连接运输层协议

什么是面向连接?
通信模式中的一种,它指通信双方在通信之前需要先建立连接,连接建立好后再进行通信,另外通信结束后还要释放已经建立的连接。
打电话就是一个面向连接的过程。通话前要先拨号建立连接,拨通后进行对话,通话结束后要挂机释放连接。
这就是说,应用程序在使用TCP协议之前,必须先建立TCP连接。在传送数据完毕后,必须释放已经建立的TCP连接。也就是说,应用进程之间的通信好像在“打电话”。
注意:
  • TCP连接是一条虚连接(也就是逻辑连接),而不是一条真正的物理连接。
  • TCP连接就是由协议软件所提供的一种抽象。
 
2.TCP提供可靠交付的服务。通过TCP连接传输的数据,无差错、不丢失、不重复,并且按序到达。
 
3.每一条TCP 连接只能有两个端点,每一条TCP连接只能是点对点的(一对一)
TCP连接的端点是什么呢?(在书本P212)
不是主机,不是主机的IP地址,不是应用进程,也不是运输层的协议端口。而是叫做套接字或插口。
端口号拼接到IP地址即构成了套接字,套接字结构如下:
套接字 socket = (IP地址:端口号)
端口号:port
例如:若IP地址是 192.168.23.5,而端口号是80,那么得到的套接字就是(192.168.23.5:80)
每一条TCP连接唯一地被通信两端的两个端点(即两个套接字)所确定。即:
TCP连接 ::={socket1,socket2} =
{(IP1:port1),(IP2:port2)}
这里的IP1IP2分别是两个端点主机的IP地址,而port1port2分别是两个端点主机中的端口号。TCP连接的两个套接字就是socket1 socket2
注意:
1TCP连接的端点是个很抽象的套接字,即 (IP地址:端口号)。
2)同一个IP地址可以有多个不同的TCP连接,(因为同一个主机里可能有多个应用程序在通信)而同一个端口号也可以出现在多个不同的TCP连接中。(一个应用程序可能和不同的目标主机通信)
4.TCP提供全双工通信。TCP允许通信双方的应用程序在任何时候都能发送数据。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。
5.面向字节流
TCP中的“流”指的是流入到进程或从进程流出的字节序列
TCP并不关心应用进程一次把多长的报文发送到 TCP
的缓存中,而是根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应包含多少个字节。
如果应用进程传送到TCP缓存的数据会太长,TCP就可以把它划分短一些再传送。如果应用程序一次只发来一个字节,TCP也可以等待积累足够多的自己节后再构成报文段发送出去。(见下图)
图片来自网络
注意:
1)“面向字节流”的含义是:虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。
2)TCP并不知道所传送的字节流的含义。
3)TCP不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的有关系。
例如发送方应用程序交给发送方的TCP共十块个数据块但接收方的TCP可能只用了四个数据块就把收到的字节流交付上层的应用程序。(这里的数据块内容量不一样,前者的数据块小,后者的数据块大。就好比我吃的一碗米饭相当于你的十碗米饭,前者的碗大,后者的碗小)但接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。
4)接收方的应用程序必须有能力识别收到的字节流,并把它还原成有意义的应用层数据。
来个图片加深了解一下。
图片来自百度
突然想到了一句话,不管你多大,在父母眼里你永远就是个孩子。
个人觉得面向字节流和上句话有着异曲同工之妙,也就是说不管你应用层传递给我TCP的数据块有多大,我统统看成以字节为单位的字节流进行接收和发送,然后根据接收方要求,发送对应报文段,报文段形成的这个过程中有可能对收到的报文段进行拆分(对方只收数据部分3个字节,但上面传下来的却大于3字节,这时候就需要拆分),有可能进行组合(对方只收数据部分3个字节,上面传下来1字节,我TCP再等等,凑够3个字节再封装进行发送),也就是说我TCP

原创文章,作者:速盾高防cdn,如若转载,请注明出处:https://www.sudun.com/ask/77400.html

(0)
速盾高防cdn's avatar速盾高防cdn
上一篇 2024年5月25日 下午10:54
下一篇 2024年5月25日 下午10:56

相关推荐

  • JAVA学会可以干什么?

    是一张清晰的职业路线图,就能让我们的职场路更快、更稳! 学习 Java 这门编程语言,在掌握了 Java 语言本身之后,我们有几个方向可以选择: 1)Java 企业级系统开发 2)…

    2024年5月29日
    0
  • 简述Java内部类

    Java:简述内部类 在类的内部编写的类就叫内部类!即一个类的内部又完整的嵌套了另一个类结构,被嵌套的类称为内部类,嵌套其他类的类称为外部类。 内部类是类的第五大成员(类的五大成员…

    CDN资讯 2024年5月29日
    0
  • DNS域名系统

      行之力则知愈进,知之深则行愈达,为了激发学生们对信息技术专业学习的兴趣和热情,帮助大家了解更多实用的计算机知识,信息技术学院特别开设了“IT知识库”专栏。日日不断,滴水穿石,传…

    2024年5月25日
    0
  • 深入理解 Java 函数式编程系列 第 5 部分 深入解析 Monad

    在本系列的前四篇文章中对函数式编程进行了多方位的介绍。本文将着重介绍函数式编程中一个重要而又复杂的概念:Monad。一直以来,Monad 都是函数式编程中最具有神秘色彩的概念。正如…

    CDN资讯 2024年4月15日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注