它建立在网际层协议(IP)提供的数据包传输技术之上,。TCP使应用程序可使用连续的数据进行通信。除非由于网络故障导致连接中断或冻结,TCP都能保证数据流完好地传输。而不会发生丢包 ,重包或是乱序的问题。

1 TCP工作原理

  如果使用udp提供的数据报机制,代码还要考虑传输的可靠性问题,以及错误是的恢复方案。但如果用TCP,数据包就隐藏在协议层之下,应用只需要型目标机器发生数据流,TCP会自动将丢失的信息重发,保证信息能够成功到达目标机器。对于程序可见的只有数据流,实际的数据包和序列号都被操作系统的网络栈巧妙地隐藏了。

如何提供可靠的连接:

#每个TCP数据包都有一个序列号

#并不使用顺序的整数作为数据包的序列号

#初始序列号是随机的

#并不通过锁步的方式通信,这种方式必须等待每个接收完才发下一个。相反,TCP可以无需等待一口气发多个。某一刻对方希望同时传输的数据量叫做TCP窗口的大小。

#接收方的TCP实现可以通过控制发送方的窗口大小来减缓或暂停。这叫流量控制。

#如果TCP认为数据包被丢弃,他会认为网络变拥挤,然后减少发送的数据量。

2 何时使用TCP

两台主机间建立TCP连接需要三个数据包:

SYN:“我想通信,这是数据包的初始序列号”

SYN-ACK:“好的,这是我向你发送数据包的初始序列号”

ACK::“好的”

通信结束时,要发送另外3个或4个数据包来关闭连接。

不需要使用TCP:

一。如果客户端只需向服务器发送单个较小的请求,并且请求后无需后续通信。

二。客户端与服务器之间不存在长时间的连接的情况下。

三。当丢包现象发生时,如果应用程序有比简单地重传数据聪明的多的方法的话。

3 TCP套接字的含义

  getsockname()函数用于获取一个套接字的名字。它用于一个已捆绑或已连接套接字s,本地地址将被返回。本调用特别适用于如下情况:未调用bind()就调用了connect(),这时唯有getsockname()调用可以获知系统内定的本地地址。在返回时,namelen参数包含了名字的实际字节数。

  跟UDP的情况一样,TCP也使用端口号来区分同一IP地址上运行的不同应用程序。对于知名端口号和临时端口号的划分习惯于UDP是一致的。

9 小结

  基于TCP的“流”套接字提供了所有必须的功能,包括重传丢失数据包,重新排列接收到的顺序错误的数据包,以及将大型数据流分割为针对特定网络的具有最优大小的数据包。这些功能提供了对网络上两个套接字之间传输并接收数据流的支持。

  更udp一样,TCP也使用端口号来区分同一机器上可能存在的多个流端点。想要接收TCP连接请求的程序需要通过bind()绑定到一个端口,在套接字上运行listen(),然后进入一个循环,不断运行accept(),为每个连接请求新建一个套接字(用于与特定客户端进行通信)。如果程序想要连接到已经存在的服务器端口,那么只需要建一个套接字,然后调用connect()连接到一个地址即可。

  服务器通常都要为绑定的套接字设置SO_REUSEADDR选项,以防止同一端口上最近运行的正在关闭中的连接阻止操作系统进行绑定。

  实际上,数据是通过send()和recv()来发送和接收的。一些基于TCP的协议会对数据进行标记,这样客户端和服务器就能自动得知通信何时完成。其他协议把TCP套接字看作真正的流,会不断发射接收数据,直到文件传输结束。套接字shutdown()可以用来为套接字生成一个方向上的文件结束符(所以套接字本质上都是双向的),同时保持另一方向的连接处于打开状态。

  如果通信双方都写数据,套接字缓冲区被越来越多的数据填满,二这些数据去从没被读取,那么就可能发生死锁。最终在某个方先上再也无法通过send()来发数据,然后可能会永远等待缓冲区清空,从而导致阻塞。

  如果想把一个套接字传递给一个支持读取或写入普通文件对象的 Python模块,可以使用makefile()方法。该方法返回一个Python对象。调用方法需要读取及写入数据时,该对象会在底层调用recv()he send().

三、 TCP(传输控制协议)的更多相关文章

  1. 【RL-TCPnet网络教程】第12章 TCP传输控制协议基础知识

    第12章      TCP传输控制协议基础知识 本章节为大家讲解TCP(Transmission Control Protocol,传输控制协议),通过本章节的学习,需要大家对TCP有个基本的认识,方 ...

  2. TCP 传输控制协议(转)

    开头先说几个协议: IP:网际协议 TCP:传输控制协议 Http:超文本传输协议 AMQP:高级消息队列协议 一:TCP是什么? TCP(Transmission Control Protocol ...

  3. 读书笔记 --TCP :传输控制协议(二)

    TCP建立连接 请求端(客户端)发送一个SYN指明客户端打算连接的服务器端口号,以及初始序列号. 服务端发回包含服务器的初始序号的SYN报文段作为应答.同时,将确认序号设置为客户的ISN加1以对客户的 ...

  4. 网络协议抓包分析——TCP传输控制协议(连接建立、释放)

    前言 TCP协议为数据提供可靠的端到端的传输,处理数据的顺序和错误恢复,保证数据能够到达其应到达的地方.TCP协议是面向连接的,在两台主机使用TCP协议进行通信之前,会先建立一个TCP连接(三次握手) ...

  5. 读书笔记 --TCP :传输控制协议(一)

    TCP提供一种面向连接的,可靠的字节流服务. TCP 通过如下方式来提供可靠性: 应用数据被分割成TCP认为最适合发送的数据块. 超时重传机制.TCP发出一个段后,启动一个定时器,等待目的端确认收到这 ...

  6. TCP/IP学习笔记:TCP传输控制协议(一)

    1 TCP的服务 尽管TCP和UDP都使用相同的网络层(IP),TCP却向用户提供一种面向连接的,可靠地字节流服务.两个使用TCP的应用,在彼此交换数据之前必须先建立一个TCP连接,在一个TCP连接中 ...

  7. 10 TCP 传输控制协议 UDP区别

    1.tcp和udp区别 2.TCP通信模型 生活中的电话机 如果想让别人能更够打通咱们的电话获取相应服务的话,需要做一下几件事情: 买个手机 插上手机卡 设计手机为正常接听状态(即能够响铃) 静静的等 ...

  8. TCP/IP详解 卷一(第十七章 TCP:传输控制协议)

    与UDP协议相比,TCP提供一种面向连接的.可靠的字节流服务. TCP首部 跟UDP一样,TCP数据被封装在一个IP数据报中,下面显示TCP的首部数据格式 每个TCP段都包含源端和目的端的端口号,用于 ...

  9. tcp - 传输控制协议 (TCP)

    总缆 SYNOPSIS #include <sys/socket.h> #include <netinet/in.h> tcp_socket = socket(PF_INET, ...

  10. [TCPIP] 传输控制协议 Note

    TCPIP  TCP 传输控制协议 TCP提供一种面向连接的,可靠的字节流服务. 面向连接意味着两个使用TCP的应用在传输数据之前先建立一个TCP连接,这个过程跟打电话相似.在一个TCP连接中仅有两方 ...

随机推荐

  1. 手摸手。完成一个H5 抽奖功能

    要完成一个这样的抽奖功能 构思 奖励物品是通过接口获取的(img) 奖励结果是通过接口获取的(id) 抽奖的动画需要由慢到快再到慢 抽奖转动时间不能太短 抽奖结束需要回调 业务代码和功能代码要分离 先 ...

  2. centos7.3安装chrome

    Centos7安装chrome浏览器 1.配置yum源 在目录 /etc/yum.repos.d/ 下新建文件 google-chrome.repo cd /ect/yum.repos.d/ vim ...

  3. 配置ca服务器和http,mail加密

    一·CA介绍 certificate authority   数字证书授权中心 被通信双方信任的.独立的第三方机构 负责证书颁发.验证.撤销等管理 数字证书 经证书授权中心数字签名的包含公开密钥拥有者 ...

  4. 结合docker发布前端项目(基于npm包管理)的shell脚本

    结合docker发布前端项目(基于npm包管理)的shell脚本 本教程依据个人理解并经过实际验证为正确,特此记录下来,权当笔记. 注:基于linux操作系统 目前主流的前后端分离的项目中,常常在部署 ...

  5. 比特币学习笔记(一)---在windows下编译搭建比特币环境

    最近打算研究下比特币源码,却发现这套源码正常情况下得在linux下编译运行,而我的机器是windows的. 怎么办呢? 起初打算用mingw和cygwin搞搞看,试了许久后发现行不通,必须转到linu ...

  6. 公司没有 DBA,Mysql 运维自己来

    如果你的公司有 DBA,那么我恭喜你,你可以无视 Mysql 运维.如果你的公司没有 DBA,那你就好好学两手 Mysql 基本运维操作,行走江湖,防身必备. 环境:CentOS7 版本: 一.虚拟机 ...

  7. 奇葩的Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

    启动springboot的时候莫名其妙出现这个错误,我properties里面也没配置数据源啥的,但就是出现这个错误 解决方法: 在启动类上加@SpringBootApplication(exclud ...

  8. invalid expression: missing ) after argument list in xxx 或者 console.error(("[Vue warn]: " + msg + trace));

    效果图:   此处错误原因   中文输入法的 逗号 导致    :   解决方案: 改为 英文输入法的 逗号

  9. Webpack实战(五):轻松读懂Webpack如何分离样式文件

    在上一篇文章中我给大家分享了预处理器(loader),里面讲到了style-loader 和css-loader,有关样式引入的问题,但是上面的样式文件只是引入到style标签里面,并不是我想要的样式 ...

  10. Redux 一步到位

    简介 Redux 是 JavaScript 状态容器,提供可预测化的状态管理 Redux 除了和 React 一起用外,还支持其它库( jquery ... ) 它体小精悍(只有2kB,包括依赖) 由 ...