传输控制协议(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)的更多相关文章

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

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

  2. TCP(传输控制协议)和三次握手和四次断开

    TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义.在简化的计算机网络OSI模型中, ...

  3. 《TCP/IP详解卷1:协议》第17、18章 TCP:传输控制协议(1)-读书笔记

    章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...

  4. 《TCP/IP详解卷1:协议》第17、18章 TCP:传输控制协议(2)-读书笔记

    章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...

  5. TCP/IP 中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议

    原文地址:http://hi.baidu.com/albyuyrgqgbbhoq/item/65006d2d002ab33195f62ba1 TCP/IP(Transmission Control P ...

  6. 传输控制协议(TCP) -- 连接建立及终止过程

    TCP简介 相对于不可靠.无连接的用户数据报协议(User Datagram Protocol, UDP),传输控制协议(Transmission Control Protocol, TCP)是可靠的 ...

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

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

  8. TCP (传输控制协议)

    http://baike.baidu.com/item/TCP/33012?fr=aladdin TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可 ...

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

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

随机推荐

  1. 三、gridView增删改查

    1. 新增或修改一条数据 1.1 添加 新增或修改按钮 <div style="width: 120px; float: right; padding-top: 3px"&g ...

  2. Swift-取消传统For循环

    1.取消传统的For循环 传统的for,在swift 3.0 被取消 i++/++i在swift 3.0 被取消 i += 1代替 for var i = 0;i<10;i +=1 { } 2. ...

  3. MarkDown 编辑器学习

    MarkDown 编辑器学习 是一种简单快键的文字排版工具,可以用于编写说明文档,鉴于其语法简洁明了,且其渲染生成的样式简单美观,很多开发者也用它来写博客,已被国内外很多流行博客平台所支持.生成的文件 ...

  4. iframe跨域上传图片

    方案一:用jquery的$.post异步提交,然后把返回来的值用jquery填充到隐藏域中.可是$.post不支持跨域. jQuery.ajax()支持get方式的跨域,这其实是采用jsonp的方式来 ...

  5. CSS改变placeholder的颜色

    :-moz-placeholder { /* Mozilla Firefox 4 to 18 */ color: #a1a1a1; } ::-moz-placeholder { /* Mozilla ...

  6. http头部如何对缓存的控制

    文章自于我的个人博客 使用缓存的目的就是在于减少计算,IO,网络等时间,可以快速的返回,特别是流量比较大的时候,可以节约很多服务器带宽和压力. 一个请求从缓存的方面来说,有三个过程. 本地检查缓存是否 ...

  7. ArcGIS API for JavaScript开发初探——基本地图组件使用

    1.前言 在上一篇我们已经我们已经讲述了第一个地图应用程序的HelloMap的创建过程,这一篇我们来讲述基本地图组件:Home Button.比例尺.鹰眼图的使用方法. 2.基本地图组件 在ArcGI ...

  8. dedecms网站扩展手机网站—共用数据库真正做到电脑手机同步访问,原pc站无需改动,对原pc站无任何影响

    在如今无线互联网大潮的冲击下,越来越多的pc网站访问量下降,首当其冲的就是以pc网站为生的站长们,为了顺应无线互联网的要求,站长们很有必要为自己的pc网站扩展一套手机网站,更早的抓住手机用户的流量,使 ...

  9. Razor 语法糖常规用法

    1.隐匿代码表达式 例: @model.name 会将表达式的值计算并写入到响应中,输入时采用html编码方式 2.显示表达式 例:@(model.name)会将输入@model.name字符串 3. ...

  10. VtigerCRM-6.4.0-zh_CN (OpenLogic CentOS 7.2)

    平台: CentOS 类型: 虚拟机镜像 软件包: vtigercrm6.4.0 commercial crm mysql open source php vtiger 简体中文版 服务优惠价: 按服 ...