传输控制协议(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. Day4上午

    expect100+50+50, In fact 100+10+0. 代码能力还有待提高,部分分应该能拿的.结果...力不从心啊. T1 贪心做的不知对不对. 看来思路是对的,不知道能不能对. 暴力做 ...

  2. better-scroll 遇到的问题 2

    问题的描述: 在歌曲列表页面使用了scroll插件,搜索了很多歌曲,页面出现滚动,选择播放一首歌曲,弹出播放器,将播放器最小化,页面回到歌曲列表,并且页面的底部出播放歌曲的信息(在没有播放歌曲的时候是 ...

  3. Elmah 数据库脚本

    /* 错误管理工具 SQL代码 */ CREATE TABLE dbo.ELMAH_Error ( ErrorId UNIQUEIDENTIFIER NOT NULL, Application NVA ...

  4. scss的使用方式(环境搭建)

    我用的是Koala. IDE是intellij_idea(其他IDE也可) 下载Koala:http://koala-app.com/ 2.安装(选好位置,下一步即可) 3.打开Koala,创建项目 ...

  5. 【起航计划 025】2015 起航计划 Android APIDemo的魔鬼步伐 24 App->Notification->Notifying Service Controller service中使用Notification

    这个例子介绍了如何在Service中使用Notification,相关的类为NotifyingController和NotifyingService. 在Service中使用Notification的 ...

  6. c\c++数据类型存储

    C四个 C++五个 一. 在c中分为这几个存储区 1.栈 - 由编译器自动分配释放 2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 3.全局区(静态区),全局变量和静态变量 ...

  7. php中增删改查以及返回结果(一)

    虽然毕业后找的第一份正式的工作并不那么令人满意,但是在度过最初的迷茫期后,自己还是决定成为一个程序猿. 最近也是利用上班偶尔闲下来的时间,开始看书,撸代码,写一些小程序. 这两个礼拜主要的写的都是有关 ...

  8. JavaScript 数组排序(从大到小,从小到大)

    1.数组的从大到小排序 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...

  9. 笨办法学Python(二十六)

    习题 26: 恭喜你,现在可以考试了! 你已经差不多完成这本书的前半部分了,不过后半部分才是更有趣的.你将学到逻辑,并通过条件判断实现有用的功能. 在你继续学习之前,你有一道试题要做.这道试题很难,因 ...

  10. cesium 加载kml polygon和mark(贴地形terrain效果)

    key code: var options = { camera : viewer.scene.camera, canvas : viewer.scene.canvas, clampToGround: ...