它建立在网际层协议(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. Stripe支付对接

    一.由于文档丢失原因,我就直接上代码了. 这个Stripe支付可以支持多个币种,我下面就采用"HDK"来参照支付先上一个支付效果图  提示:先上代码,在说明博主自己理解的流程. 一 ...

  2. Windows和Linux下与VMware虚拟机通过内网IP通讯

    首先分两种情况:一种是你的电脑已经在一个内网的环境下且有额外的内网IP地址,和另一种只是想给自己电脑上的虚拟机分配个内网IP来通讯. ①有可用的内网IP 找到一个空闲的IP地址(这里以192.168. ...

  3. matlab写入excel数据

    使用xlswrite 可以help xlswrite查看用法 xlswrite(filename,A)xlswrite(filename,A,sheet)xlswrite(filename,A,xlR ...

  4. KindEditor.ready 不执行的解决方法

    问题描述 按照官网的要求,一一都设置好了,但就是没法显示富文本编辑器. 1.设置好textarea输入框 <textarea id="myEditor" name=" ...

  5. 【转】ArcGIS Server 10.1 动态图层

    ArcGISServer将GIS资源以服务的方式发布,能够让更多的人在Web上浏览.使用.不过,诸如气象.环保等方面的信息是实时变化的,按照之前常规的方法,我们先要将最新获得的信息组织成地图文档后再对 ...

  6. JSON小记

    json: { "1" : "2", "1" : "3" } 在json中如果有重复的key,会取最后一个key的值,如 ...

  7. Google 开源的 Python 命令行库:fire 实现 git 命令

    作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...

  8. 【DPDK】【Multiprocess】一个dpdk多进程场景的坑

    [前言] 这是一个隐藏了近3年的问题,理论上只要用到DPDK multiprocess场景的都会遇到这个问题,具体出不出问题只能说是看运气,即使不出问题也仍然是一个风险. [场景] 我先描述一下这个问 ...

  9. MySql笔记(一)

    目录 MySql笔记(一) 每天给自己一个希望,努力做好自己,不为明天烦恼,不为昨天叹息.当梦想还在,告诉自己:努力,就总能遇见更好的自己! MySql笔记(一) 1.创建数据库以及删除 1.创建数据 ...

  10. Scrapy定制命令开启爬虫

    一.单爬虫运行 每次运行scrapy都要在终端输入命令太麻烦了 在项目的目录下创建manager.py(任意名称) from scrapy.cmdline import execute if __na ...