传输控制协议(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. 通过一个例子,总结下检测数组属性的N种方法

    判断arr数组里是否含有a,有a返回1;没有返回2var arr = [{a:1,b:2,c:3},{q:1,w:2,e:3},{s:4,g:5,i:9},{b:2,v:3,u:4}]; 检测属性的3 ...

  2. Python常用模块二

    一.time & datetime #_*_coding:utf-8_*_ import time # print(time.clock()) #返回处理器时间,3.3开始已废弃 , 改成了t ...

  3. vue将数据绑定到属性中

    *必须使用[] <tr v-for="(p,index) in prodects"> @*v-bind:class="styleType(index)&quo ...

  4. hystrix应用介绍(三)

    hystrix提供了两种隔离策略:线程池隔离和信号量隔离.hystrix默认采用线程池隔离. 1.线程池隔离 不同服务通过使用不同线程池,彼此间将不受影响,达到隔离效果. 例如: 我们可以通过andT ...

  5. java中关于冒泡排序算法的学习。

    在编程语言的学习中,排序算法在学习过程中是必须要掌握的,特别在新手的学习中,我们应该学会这些算法,本篇先介绍冒泡算法. 冒泡排序 设有一组待排序的数据: 3 2 4 5 7 1 我们需要使用冒泡排序来 ...

  6. 将php代码部署到新浪云测试(简单方法,包含数据库的连接)

    很多人做项目都是先在本地测试然后上传到服务器运行,如果包含了操作数据库的信息往往需要进行一番调试,这里我总结一下把php代码包含数据库的连接如何上传到新浪云服务器的步骤. 1.在新浪云应用SAE的控制 ...

  7. Struts2_总结

    还未学习的内容,如果到时候要用到,再去学.1.Lamda 表达式(很复杂,很少用)2.验证框架(默认验证方法 validation.方法开始前验证.开始后验证)3.UI标签(用的不多)4.类型转换中的 ...

  8. Struts2_Global_Results_全局结果集

    struts.xml文件配置 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts ...

  9. Java —异常

    异常简介 有异于常态,和正常情况不一样,有错误出现,阻止当前方法或作用域,称为异常. Java中的异常类都继承Throwable类,它有两个子类:Error和Exception.Error很少接触,主 ...

  10. centos6.5_64bit-kvm安装部署

    kvm部署安装   目录 kvm部署安装... 1 一.kvm部署... 1 1.关闭selinux和防火墙... 1 2.查看主机是否支持虚拟化... 1 3.安装kvm和其他虚拟化软件包... 1 ...