UNIX网络编程笔记(1):TCP简介
来源:互联网 发布:淘宝无法购买东西 编辑:程序博客网 时间:2024/05/11 03:59
1、简介
TCP(Transmission Control Protocol),即传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP协议有以下几个特点:
- TCP提供客户与服务器之间的连接:TCP客户先与某个服务器建立连接,跨过连接传输数据,然后断开连接;
- TCP提供了可靠性:包括超时重传、RTT(round-trip time往返时间)估计等;
- TCP提供了流量控制:包括通知窗口、慢启动等;
- TCP是双全工的:在一个连接上可以在任何时刻在进出两个方向上发送与接收数据;
2、TCP连接的建立
TCP建立连接就是大家熟知的三次握手:
通常发生以下几个步骤:
- 服务器必须准备好接收外来的连接,通常通过调用socket、bind和listen函数完成,称为被动打开;
- 客户通过调用connect函数发起主动打开,导致客户TCP发送一个SYN分节,它告诉服务器客户将在连接中发送的数据的初始序列号;
- 服务器必须确认(ACK)客户的SYN,同时自己也发送一个SYN分节,包含服务器将在同一个连接中发送的数据的初始序列号。服务器在单个分节中发送自己的SYN和对客户SYN的ACK;
- 客户必须确认服务器的SYN;
也就是说,对于客户和服务器来说,每个人都有一个初始序列号SYN,每个人对对端的确认都是在对端SYN的基础上加1。比如:客户发送SYN为j,那么服务器发送的对客户SYN的ACK就是j+1;同理,如果服务器给客户的SYN是k,那么客户发送给服务器的ACK就是k+1。下图展示了TCP的三次握手的具体过程:
由图可知,ACK中的确认号就是发送这个ACK的一端所期待的下一个序列号。
3、TCP连接的终止
终止一个TCP连接需要四个分节,因为这里涉及到数据的传输。
下面是TCP连接终止的步骤:
- 某个应用进程首先调用close函数,称该端执行主动关闭,于是发送一个FIN分节,表示数据发送完毕;
- 接收到这个FIN分节的对端执行被动关闭,这个FIN由TCP确认,它的接收也作为一个文件描述符传输给接收端应用进程,因为FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接受;
- 一段时间后,接收到这个文件结束符的应用进程将调用close函数关闭它的套接字。导致TCP也发送一个FIN;
- 接收这个最终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简介
- Linux/UNIX网络编程笔记(一) TCP/IP简介
- 《UNIX网络编程》读书笔记1---简介和TCP/IP
- Unix网络编程(1)------简介
- 【UNIX网络编程读书笔记】第一章 简介和TCP/IP(程序之后的笔记)
- Unix网络编程学习笔记之第1章 简介
- 《UNIX网络编程 卷2》 笔记: 简介
- 《Unix 网络编程》学习笔记 第一章:简介
- UNIX网络编程:TCP
- unix网络编程之简介和运输层TCP/UDP
- UNIX网络编程——TCP/IP简介
- unix网络编程---读书笔记(一)---tcp/udp/sctp简介
- 《UNIX网络编程》学习笔记:基本TCP套接字编程
- 《UNIX网络编程卷1》读书笔记--第一章 简介和TCP/IP
- UNIX网络编程笔记 第三章 套接字编程简介
- 《UNIX网络编程》TCP网络编程基础(1)
- unix网络编程第1章:简介
- unix网络编程之tcp
- 读书笔记--IPC机制(二)
- IBInspectable / IBDesignable
- <2>Android4.4——传感器初始化流程
- Android ScrollView自动滑动一段距离的问题解决
- Tomcat中JVM内存溢出及合理配置
- UNIX网络编程笔记(1):TCP简介
- Leetcode #242 Valid Anagram
- eclipse--Debug Eclipse断点调试基础
- poj--1904--King's Quest(scc建图)
- 邪恶的静态变量之知识补遗
- SDWebimag提示 GBitmapContextCreate: unsupported parameter combination: 8 integer bits/component; 40 错误
- Centos查看apache,nginx并发连接数和TCP连接状态命令
- iOS Touch ID
- 网站制作教程-如何才能做好一个网站?