1、简介

TCP(Transmission Control Protocol),即传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP协议有以下几个特点:

  1. TCP提供客户与服务器之间的连接:TCP客户先与某个服务器建立连接,跨过连接传输数据,然后断开连接;
  2. TCP提供了可靠性:包括超时重传、RTT(round-trip time往返时间)估计等;
  3. TCP提供了流量控制:包括通知窗口、慢启动等;
  4. TCP是双全工的:在一个连接上可以在任何时刻在进出两个方向上发送与接收数据;

2、TCP连接的建立

TCP建立连接就是大家熟知的三次握手:

通常发生以下几个步骤:

  1. 服务器必须准备好接收外来的连接,通常通过调用socket、bind和listen函数完成,称为被动打开;
  2. 客户通过调用connect函数发起主动打开,导致客户TCP发送一个SYN分节,它告诉服务器客户将在连接中发送的数据的初始序列号;
  3. 服务器必须确认(ACK)客户的SYN,同时自己也发送一个SYN分节,包含服务器将在同一个连接中发送的数据的初始序列号。服务器在单个分节中发送自己的SYN和对客户SYN的ACK;
  4. 客户必须确认服务器的SYN;

也就是说,对于客户和服务器来说,每个人都有一个初始序列号SYN,每个人对对端的确认都是在对端SYN的基础上加1。比如:客户发送SYN为j,那么服务器发送的对客户SYN的ACK就是j+1;同理,如果服务器给客户的SYN是k,那么客户发送给服务器的ACK就是k+1。下图展示了TCP的三次握手的具体过程:

由图可知,ACK中的确认号就是发送这个ACK的一端所期待的下一个序列号。

3、TCP连接的终止

终止一个TCP连接需要四个分节,因为这里涉及到数据的传输。

下面是TCP连接终止的步骤:

  1. 某个应用进程首先调用close函数,称该端执行主动关闭,于是发送一个FIN分节,表示数据发送完毕;
  2. 接收到这个FIN分节的对端执行被动关闭,这个FIN由TCP确认,它的接收也作为一个文件描述符传输给接收端应用进程,因为FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接受;
  3. 一段时间后,接收到这个文件结束符的应用进程将调用close函数关闭它的套接字。导致TCP也发送一个FIN;
  4. 接收这个最终FIN的原发送端(即执行主动关闭的一端)确认这个FIN;

连接的两端每一端都需要一个FIN和ACK,因此需要四个分节。不过也有可能不是四个。比如,执行主动关闭的一端的FIN可以随数据一起发送,还有,执行被动关闭的一端的ACK和自己的FIN有可能一起发送。下图展示了关闭连接的过程:

和TCP建立连接一样,这里的ACK是FIN+1。

图中给出的是客户端执行主动关闭,不过可以由服务器端执行主动关闭。

4、TCP状态转换图

由于TCP连接的建立涉及到三次握手,终止连接需要四次握手,因此TCP连接的状态在一次完整的连接与终止中可能达到多个。实际上,一个TCP连接的状态可以有11种,这些状态可以由具体的操作连接起来,形成一个状态转换图。

下图就是TCP状态转换图,图中用粗实线表示通常的客户状态转换,用粗虚线表示通常的服务器状态转换:

5、一个完整的TCP连接

下图展示了一个完整的TCP连接,包括建立连接、数据传输与连接终止三个过程:

6、套接字对

一个TCP连接的套接字对(socket pair)是一个定义该连接的两个端点的四元组:本地IP地址、本地TCP端口号。外地IP地址、外地TCP端口号。套接字对唯一标识一个网络上的每个TCP连接。

标识每个端点的两个值(IP地址和端口号)通常称为一个套接字。

UNIX网络编程笔记(1):TCP简介相关推荐

  1. 进程fork和exec ---Unix网络编程笔记

    进程fork和exec ---Unix网络编程笔记 fork 一次调用,两次返回 fork的两个典型用法 最简单的并发服务器---fork子进程 exec -Unix网络编程笔记) fork #inc ...

  2. 【Linux网络编程笔记】TCP短连接产生大量TIME_WAIT导致无法对外建立新TCP连接的原因及解决方法—实践篇

    1. 查看系统网络配置和当前TCP状态         在定位并处理应用程序出现的网络问题时,了解系统默认网络配置是非常必要的.以x86_64平台Linux kernelversion 2.6.9的机 ...

  3. Unix 网络编程(四)- 典型TCP客服服务器程序开发实例及基本套接字API介绍

    转载:http://blog.csdn.net/michael_kong_nju/article/details/43457393 写在开头: 在上一节中我们学习了一些基础的用来支持网络编程的API, ...

  4. UNIX网络编程笔记(2):一个简单的时间获取程序

    这一讲通过一个简单的时间获取程序简单介绍套接字编程. 1.套接字API 1.1.套接字地址结构 上一讲中介绍了TCP的一些内容,知道了一个套接字对唯一标识了网络中的一个TCP连接,而一个套接字标识了一 ...

  5. 《Unix网络编程》卷一(简介TCP/IP、基础套接字编程)

    通常说函数返回某个错误值,实际上是函数返回值为-1,而全局变量errno被置为指定的常值(即称函数返回这个错误值). exit终止进程,Unix在一个进程终止时总是关闭该进程所有打开的描述符. TCP ...

  6. UNIX网络编程笔记(7):回射程序的UDP版本

    1.UDP简介 UDP是一个简单的传输层协议,应用进程往一个UDP套接字写入数据,随后被封装到一个UDP数据报,进而又被封装到一个IP数据报,然后发送到目的地.UDP不保证UDP数据报会最终到达目的地 ...

  7. UNIX网络编程笔记(3):简单的并发服务器

    上一讲中的简单时间获取服务器是一个迭代服务器,对于获取时间来说够用了.迭代服务器有这样的特点:同一时间只能给一个客户服务.也就是说,如果某一时刻服务器与某个客户正在连接,其它客户必须等到上一个客户与服 ...

  8. UNIX网络编程笔记(6):I/O复用之select函数

    上一讲中我们正确处理了僵尸子进程,使得这个简单的服务器更加健壮.不幸的是,这个程序仍然有问题.想象一下,如果一个客户正在和一个服务器子进程连接建立完毕正在通话,而服务器子进程意外终止(比如kill), ...

  9. UNIX网络编程笔记(4):简单的回射程序

    上一讲中我们通过调用fork函数实现了一个简单的并发时间获取服务器.这是一个简单的并发服务器框架,然而这里使用这个框架实现一个简单的回射服务器会出现一个问题,这个问题就是僵尸子进程. 1.回射程序 下 ...

最新文章

  1. 试试这个文字冒险游戏,故事是AI写的:情节丰满逻辑不乱,进去就出不来了,在线可玩...
  2. 输出链表中倒数第k个结点
  3. ElementUI中el-upload传递额外参数为date类型时后台SpringBoot接收不到
  4. Scala @BeanProperty注解生成getter/setter
  5. 计算机改成服务器,旧电脑主机如何改成服务器
  6. 大厂面试常问的机器学习,计算机视觉怎么学?详细指南来了!
  7. 【深度学习原理】交叉熵损失函数的实现
  8. 最新 Bitnami redmine安装与配置
  9. 【渝粤题库】陕西师范大学210007 幼儿园音乐教育 作业(高起专)
  10. Attachments
  11. mac 思科 链路聚合_链路聚合定义/Eth-trunk/思科华为配置实例
  12. 前端学习从入门到高级全程记录之43 (PHP基础Ⅵ)
  13. python如何读取dbf文件_python2.7读取dbf文件的正确姿势
  14. 1946年产生的第一台电子计算机6,1946年第一台计算机在美国诞生——青夏教育精英家教网——...
  15. 关于Video Src 带有 blob:http的视频如何下载的问题
  16. ONF(Open Networking Foundation)
  17. mysql区分大小写嘛_Mysql区分大小写问题
  18. 武汉大学计算机学院跳楼,武汉大学一男生跳楼身亡,自杀原因反思:徒劳教育往往跟父母有关...
  19. C语言输出整数部分和小数部分
  20. 2017秋招第一面--阿里巴巴

热门文章

  1. 图解 深入浅出 JavaWeb:Servlet 再说几句
  2. dnse 2.0音效厉害还是full sound厉害点呢?谢谢!!
  3. 中文简体字-繁体字转换 WEB 服务(源代码)
  4. 在jsp文件中通过超链接访问servlet_Eclipse中创建Servlet
  5. caffe 人脸关键点检测_人脸检测关键点新增至81个,比Dlib更精准、更贴边
  6. 禁用mysql的sleep函数_MySQL的sleep函数的特殊特现象
  7. python笔记全_Python笔记
  8. play 连接mysql_Play framework 2.x 连接mysql | 学步园
  9. 台达b3伺服modbus通讯_【数控系统】台达伺服压机控制灵活 精准压合满足各种工序需求...
  10. python1~10阶乘while_Python3基础 while 阶乘