传输控制协议(TCP)
传输控制协议(TCP)【来自Unix网络编程(卷一)第2章】
1、TCP是一个面向连接、可靠性的传输协议;
2、TCP含有用于动态估算客户与服务器之间往返时间(RTT)的算法,以便它知道等待一个确认需要多少时间;若 超过这个时间则超时重传。一般RTT在一个局域网上大约是几毫秒,跨越一个广域网可能是数秒。
3、TCP通过给其中每个字节关联一个序列号对所发送的数据进行排序。
如果分节分顺序到达,接收端TCP将先根据他们的序列号重新排序,再把结果数据传递给接收应用。
接收端TCP负责重新排序,接收端应用只负责接收排序好的数据进行处理。
4、TCP提供流量控制。TCP总是告知对端在任何时刻它一次能够从对端接收多少字节的数据,这称为通告窗 口。
在任何时刻,该窗口指出接收缓冲区中当前可用的空间量,从而确保发送端发送的数据不会使接收缓冲 区溢出。
该窗口时刻动态变化:当接收到来自发送端数据时,窗口大小就减小,但是当接收端应用从缓冲区中读 取数据时,窗口大小就增大。通告窗口大小减小到0是有可能的:当TCP对应某个套接字的接收端缓冲区已满,导致它必须等待应用从该缓冲区读取数据时,方能从对端在接受数据。
5、TCP连接是全双工的。UDP亦可以是全双工的。
-----------------------------------------------------------------
TCP连接的建立与终止
1、三次握手
1)服务器必须准备好接收外来的连接。服务器端通过调用socket、bind和listen这3个函数来完成,我们称之为 被动打开。
2)客户通过调用connect发起主动打开。这导致客户TCP发送一个SYN(同步分节),他告诉服务器客户将在(待建立)连接中发送的数据的初始序列号(不一定从一开始吧)。通常SYN分节不携带数据,其所在IP数据 报只包含一个IP首部、一个TCP首部及可能有的TCP选项。
3)服务器必须确认(ACK)客户的SYN,同时自己也得发送一个SYN分节(服务器和客户端都各自有一个SYN初试序列号,这两个初始序列号之间并无之间联系),它含有服务器将在同一连接中发送的数据的初始序列号。服务器在单个分节中发送SYN和对客户SYN的ACK确认。
4)客户必须确认服务器的SYN。
这种交换至少需要3个分组,因此称之为TCP的三次握手(three-way-handshark)。
示意图:
图中给出的客户的初始序列号为J,服务器的初始序列号为K。ACK中的确认号是发送这个ACK的一端所期待的。类似的,每一个FIN(表示结束)的ACK中的确认号为该FIN序列号加1.(ACK是对SYN确认的)
形象化:
建立一个TCP连接就好比一个电话系统。socket函数等同于有电话可用。bing函数是在告诉别人你的电话号码,这样他们可以呼叫你。listen函数是打开电话振铃,这样当有一个外来呼叫到达时,你就可以听到。connect函数要求我们知道对方的电话号码并拨打他。
2、TCP连接终止
TCP连接的需要3个分节,终止一个连接则需要4个分节。
1)某个应用进程(可以使客户端应用进程也可以是接收端应用进程)首先调用close,我们称该端执行主动关闭。该段的TCP于是发送一个FIN分节,表示数据发送完成。
2)接收到这个FIN的对端执行被动关闭。这个FIN由TCP确认。它的接收也作为一个文件结束符传递给接收端应用进程(放在已排队等候该应用进程接收的任何其他数据之后),因为FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。
3)一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN。(Close函数被调用之后,TCP就发送一个FIN)
4)接收这个最终FIN的原发送端TCP(即执行主动关闭的那一端)确认这个FIN。
示意图:
半关闭:只有步骤1和2时,称为半关闭。
TCP半开连接:是指发送了TCP连接请求,等待对方应答的状态,此时连接并没有完全建立起来,双方还无法进行通信交互的状态,此时就称为半连接。由于一个完整的TCP连接需要经过三次握手才能完成,这里把三次握手之前的连接都称之为半连接。
3、TCP的状态转换
MSS:不同方向上的MSS不同不成问题;MSS用于向对端TCP通告对端在每个分节中能发送的最大TCP数量。;比如:客户端的MSS=536,这个则表示客户端能接收的最大分节大小是536.
4、TCP输出
每一个TCP套接字有一个发送缓冲区,我们可以使用SO_SENDBUF套接字选项来更改该缓冲区的大小。
套接字默认为阻塞的。当应用程序进程向TCP套接字缓冲区写入数据时,而TCP套接字发送缓冲区容不下该应用进程的所有数据,该应用进程将被投入睡眠,内核将不从write系统调用返回,直到应用进程缓冲区中的所有数据都复制到套接字的发送缓冲区。因此,从写一个TCP套接字的write调用成功返回仅仅表示我们可以重新使用原来的应用进程缓冲区,并不表示对端的TCP或应用进程已接收到数据。
数据传到数据链路层时,每个数据链路都有一个输出队列,如果该队列已满,那么新到的分组将被丢弃(数据链路层也有丢包的功能,屌)并沿着协议栈向上返回一个错误:从数据链路到IP,再从IP到TCP,TCP将注意到这个错误,并在以后某个时刻重传相应的分节。应用进程并不知道这种暂时的情况。
传输控制协议(TCP)的更多相关文章
- [TCPIP] 传输控制协议 Note
TCPIP TCP 传输控制协议 TCP提供一种面向连接的,可靠的字节流服务. 面向连接意味着两个使用TCP的应用在传输数据之前先建立一个TCP连接,这个过程跟打电话相似.在一个TCP连接中仅有两方 ...
- TCP(传输控制协议)和三次握手和四次断开
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义.在简化的计算机网络OSI模型中, ...
- 《TCP/IP详解卷1:协议》第17、18章 TCP:传输控制协议(1)-读书笔记
章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...
- 《TCP/IP详解卷1:协议》第17、18章 TCP:传输控制协议(2)-读书笔记
章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...
- TCP/IP 中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议
原文地址:http://hi.baidu.com/albyuyrgqgbbhoq/item/65006d2d002ab33195f62ba1 TCP/IP(Transmission Control P ...
- 传输控制协议(TCP) -- 连接建立及终止过程
TCP简介 相对于不可靠.无连接的用户数据报协议(User Datagram Protocol, UDP),传输控制协议(Transmission Control Protocol, TCP)是可靠的 ...
- 【RL-TCPnet网络教程】第12章 TCP传输控制协议基础知识
第12章 TCP传输控制协议基础知识 本章节为大家讲解TCP(Transmission Control Protocol,传输控制协议),通过本章节的学习,需要大家对TCP有个基本的认识,方 ...
- TCP (传输控制协议)
http://baike.baidu.com/item/TCP/33012?fr=aladdin TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可 ...
- TCP 传输控制协议(转)
开头先说几个协议: IP:网际协议 TCP:传输控制协议 Http:超文本传输协议 AMQP:高级消息队列协议 一:TCP是什么? TCP(Transmission Control Protocol ...
随机推荐
- winfrom C#树勾选等
AfterCheck /// <summary> /// 树勾选 /// </summary> /// <param name="sender"> ...
- C# DialogResult的用法
在程序中,经常会弹出一个对话框来让用户填写一些信息,填写完成后,当用户点击“确定”按钮后,在主窗体中进行其他的处理.比如一个简单的例子,在主窗体中有一个菜单,是“增加用户”,当点击这个菜单之后,我们需 ...
- 浅谈SQL Server中的三种物理连接操作(Nested Loop Join、Merge Join、Hash Join)
简介 在SQL Server中,我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所选数据的选择性转化为Loop Join,Merge J ...
- 构建web应用
一.web服务器示例 var http = require('http'); http.createServer(function(req, res){ res.writeHeader(200, {C ...
- html和java的交互,利用jsBridge开源框架
html中,js注册监听和回调 function connectWebViewJavascriptBridge(callback) { if (window.WebViewJavascriptBrid ...
- Extjs4如何构造store基类
目标:重写一个BaseStore的基类,它继承自Ext.data.Store基类. autoLoad:true/false 是否自动加载,true时创建store即自动加载,一般适合get方式:fal ...
- phpstorm 2017.1 激活
打开网址 http://idea.lanyus.com/ 选择获取注册码,复制生成的验证码 安装完成后,打开软件,依次选择菜单栏 Help -> Register-> Activation ...
- Microsoft EDP(enterprise database protection)选择应用程序在哪里可以访问企业数据
在配置策略时,对Rule template设置完成后,添加corporate identity.关于corporate identity, 目前没有什么好的理解,翻译过来就是“公司标识”,我也理解不了 ...
- DEM精度评价自动化系统的成果展示
程序员:左正康 完成时间:2013/12/3 系统开发背景: 原始的DEM精度评价方法:采用ArcGIS结合Excel的方式完成DEM的精度评价.具体操作是:利用ArcGIS工具箱中的创建TIN,T ...
- 判断团队适不适合使用node
1.要不要用 2.历史包袱 3.跟进升级 看完scott创业公司使用node,对于一个团队要不要使用node,第一个就是如果承接的项目有很多历史迭代,线上也在稳定的抛,不要轻易的替换,比如很多老代码, ...