三、 TCP(传输控制协议)
它建立在网际层协议(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(传输控制协议)的更多相关文章
- 【RL-TCPnet网络教程】第12章 TCP传输控制协议基础知识
第12章 TCP传输控制协议基础知识 本章节为大家讲解TCP(Transmission Control Protocol,传输控制协议),通过本章节的学习,需要大家对TCP有个基本的认识,方 ...
- TCP 传输控制协议(转)
开头先说几个协议: IP:网际协议 TCP:传输控制协议 Http:超文本传输协议 AMQP:高级消息队列协议 一:TCP是什么? TCP(Transmission Control Protocol ...
- 读书笔记 --TCP :传输控制协议(二)
TCP建立连接 请求端(客户端)发送一个SYN指明客户端打算连接的服务器端口号,以及初始序列号. 服务端发回包含服务器的初始序号的SYN报文段作为应答.同时,将确认序号设置为客户的ISN加1以对客户的 ...
- 网络协议抓包分析——TCP传输控制协议(连接建立、释放)
前言 TCP协议为数据提供可靠的端到端的传输,处理数据的顺序和错误恢复,保证数据能够到达其应到达的地方.TCP协议是面向连接的,在两台主机使用TCP协议进行通信之前,会先建立一个TCP连接(三次握手) ...
- 读书笔记 --TCP :传输控制协议(一)
TCP提供一种面向连接的,可靠的字节流服务. TCP 通过如下方式来提供可靠性: 应用数据被分割成TCP认为最适合发送的数据块. 超时重传机制.TCP发出一个段后,启动一个定时器,等待目的端确认收到这 ...
- TCP/IP学习笔记:TCP传输控制协议(一)
1 TCP的服务 尽管TCP和UDP都使用相同的网络层(IP),TCP却向用户提供一种面向连接的,可靠地字节流服务.两个使用TCP的应用,在彼此交换数据之前必须先建立一个TCP连接,在一个TCP连接中 ...
- 10 TCP 传输控制协议 UDP区别
1.tcp和udp区别 2.TCP通信模型 生活中的电话机 如果想让别人能更够打通咱们的电话获取相应服务的话,需要做一下几件事情: 买个手机 插上手机卡 设计手机为正常接听状态(即能够响铃) 静静的等 ...
- TCP/IP详解 卷一(第十七章 TCP:传输控制协议)
与UDP协议相比,TCP提供一种面向连接的.可靠的字节流服务. TCP首部 跟UDP一样,TCP数据被封装在一个IP数据报中,下面显示TCP的首部数据格式 每个TCP段都包含源端和目的端的端口号,用于 ...
- tcp - 传输控制协议 (TCP)
总缆 SYNOPSIS #include <sys/socket.h> #include <netinet/in.h> tcp_socket = socket(PF_INET, ...
- [TCPIP] 传输控制协议 Note
TCPIP TCP 传输控制协议 TCP提供一种面向连接的,可靠的字节流服务. 面向连接意味着两个使用TCP的应用在传输数据之前先建立一个TCP连接,这个过程跟打电话相似.在一个TCP连接中仅有两方 ...
随机推荐
- 非常完整的线性DP及记忆化搜索讲义
基础概念 我们之前的课程当中接触了最基础的动态规划. 动态规划最重要的就是找到一个状态和状态转移方程. 除此之外,动态规划问题分析中还有一些重要性质,如:重叠子问题.最优子结构.无后效性等. 最优子结 ...
- 吴恩达机器学习笔记 - cost function and gradient descent
一.简介 cost fuction是用来判断机器预算值和实际值得误差,一般来说训练机器学习的目的就是希望将这个cost function减到最小.本文会介绍如何找到这个最小值. 二.线性回归的cost ...
- bootstrap4.4 Stretched link的使用
Stretched link功能介绍:扩大可点击区域. 原理 .stretched-link::after { position: absolute; top: 0; right:0; bottom: ...
- mysql-5.7.9-winx64遇坑记
昨天在mysql5.0上导入sql文件时,一直卡在一个地方报错,也没仔细分析,认为应该是mysql版本太低不支持这个语法而已.遂决心下载一个最新版本的mysql,却浑然不知前面无数的坑已经埋伏好了在等 ...
- Antd将Table导出为Excel
Antd将Table导出为Excel 在最近的项目中,需要把表格中的数据导出给财务进行统计,网上很多一键导出的按钮都没用.经过东拼西凑,最终搞定了导出,自己封装了组件. import { File } ...
- 【tf.keras】AdamW: Adam with Weight decay
论文 Decoupled Weight Decay Regularization 中提到,Adam 在使用时,L2 与 weight decay 并不等价,并提出了 AdamW,在神经网络需要正则项时 ...
- Ncverilog 仿真quartus generate IP的要点
Ncverilog 仿真quartus generate IP的要点 最近利用quartus II 生成plll 的IP,利用nclaunch 仿真的时候老是报错, 提示unresolved in w ...
- static和final关键字
static关键字 静态变量 静态变量:又称做类变量,也就是这个变量属于整个类,而不属于单个实例.类所有的实例共享静态变量,可以直接通过类名来访问它.静态变量在内存中只存在一份,当系统第一次加载类时, ...
- 基于Arduino的红外遥控
1.红外接收头介绍 一.什么是红外接收头? 红外遥控器发出的信号是一连串的二进制脉冲码.为了使其在无线传输过程中免受其他红外信号的干扰,通常都是先将其调制在特定的载波频率上,然后再经红外发射二极管 ...
- cogs 1583. [POJ 3237] 树的维护 树链剖分套线段树
1583. [POJ 3237] 树的维护 ★★★★ 输入文件:maintaintree.in 输出文件:maintaintree.out 简单对比时间限制:5 s 内存限制:128 ...