简述
传输控制协议(
Transmission Control Protocol
,TCP
)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF
的RFC 793
定义。在因特网协议族(
Internet protocol suite
)中,TCP
层是位于IP层之上,应用层之下的中间层。
TCP/IP协议簇
TCP/IP
(TCP/IP Protocol Suite
)是一个协议簇,包含两个核心协议:TCP
(传输控制协议)和IP
(网际协议),又被称为TCP/IP
协议栈,分为四个层次:
TCP/IP分层
应用层
- 大多数普通与网络相关的程序为了通过网络与其他程序通信所使用的层。这个层的处理过程是应用特有的;数据从网络相关的程序以这种应用内部使用的格式进行传送,然后被编码成标准协议的格式。
- 应用层负责处理特定的应用程序细节。包括
Telnet
(远程登录)、FTP
(文件传输协议)、SMTP
(简单邮件传送协议)以及SNMP
(简单网络管理协议)等。
传输层
- 两台主机上的应用程序提供端到端的通信,有2种传输协议:
TCP
(传输控制协议)和UDP
(用户数据报协议)。TCP
为两台主机提供高可靠性的数据通信。包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。UDP
为主机提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必须的可靠性必须由应用层来提供。
网络层
- 处理分组在网络中的活动,例如分组的选路。网络层协议包括
IP
协议(网际协议)、ICMP
协议(Internet
互联网控制报文协议),以及IGMP
协议(Internet
组管理协议)。
网络接口层
- 也称作数据链路层,包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。一起处理与电缆(或其他任何传输媒介)的物理接口细节。
TCP协议
概述
TCP是一种面向连接(连接导向)的、可靠的基于字节流的传输层通信协议。TCP将用户数据打包成报文段,它发送后启动一个定时器,另一端收到的数据进行确认、对失序的数据重新排序、丢弃重复数据。
特点
- 面向连接
- 每一条
TCP
连接只能有两个端点,每一条TCP
连接只能是点对点的 TCP
提供可靠交付的服务TCP
提供全双工通信。数据在两个方向上独立的进行传输。因此,连接的每一端必须保持每个方向上的传输数据序号。- 面向字节流。面向字节流的含义:虽然应用程序和TCP交互是一次一个数据块,但TCP把应用程序交下来的数据仅仅是一连串的无结构的字节流。
头部
指定通信的源端端口号、目的端端口号、管理TCP连接,控制两个方向的数据流
- 源端口号:数据发起者的端口号,
16bit
- 目的端口号:数据接收者的端口号,
16bit
- 序号:
32bit
的序列号,由发送方使用 - 确认序号:
32bit
的确认号,是接收数据方期望收到发送方的下一个报文段的序号,因此确认序号应当是上次已成功收到数据字节序号加1 - 首部长度:首部中
32bit
字的数目,可表示15*32bit=60
字节的首部。一般首部长度为20
字节。 - 保留:
6bit
,均为0
- 紧急
URG
:当URG=1
时,表示报文段中有紧急数据,应尽快传送 - 确认比特
ACK
:ACK = 1
时代表这是一个确认的TCP
包,取值0则不是确认包 - 推送比特
PSH
:当发送端PSH=1
时,接收端尽快的交付给应用进程 - 复位比特(
RST
):当RST=1
时,表明TCP连接中出现严重差错,必须释放连接,再重新建立连接 - 同步比特
SYN
:在建立连接时用来同步的序号。SYN=1
,ACK=0
表示一个连接请求报文段。SYN=1
,ACK=1
表示同意建立连接 - 终止比特
FIN
:FIN=1
时,表明此报文段的发送端的数据已经发送完毕,并要求释放传输连接 - 窗口:用来控制对方发送的数据量,通知发放已确定的发送窗口上限
- 校验和:该字段检验的范围包括首部和数据这两部分。由发端计算和存储,并由收端进行验证
- 紧急指针:紧急指针在
URG=1
时才有效,它指出本报文段中的紧急数据的字节数 - 选项:长度可变,最长可达40字节
三次握手
第一次握手:客户端向服务端发送连接请求包,标志位
SYN
(同步序号)置为1
,序号为X=0
。
第二次握手:服务器收到客户端发过来报文,由
SYN=1
知道客户端要求建立联机。向客户端发送一个SYN
和ACK
都置为1
的TCP
报文,设置初始序号Y=0
,将确认序号(Acknowledgement Number
)设置为客户的序列号加1
,即X+1 = 0+1 = 1
第三次握手:客户端收到服务器发来的包后检查确认序号(
Acknowledgement Number
)是否正确,即第一次发送的序号加1
(X+1=1
)。以及标志位ACK
是否为1
。若正确,ACK
标志位为1
,SYN
标志位为0
。确认序号(AcknowledgementNumber
)=Y+1=0+1=1
,发送序号为X+1=1
。服务端收到后确认序号值与ACK=1
,则连接建立成功,可以传送数据。
四次挥手
第一次挥手:客户端给服务器发送
TCP
包,用来关闭客户端到服务器的数据传送。将标志位FIN
和ACK
置为1
,序号为X=1
,确认序号为Z=1
。
第二次挥手:服务器收到FIN后,发回一个
ACK
(标志位ACK=1
),确认序号为收到的序号加1
,即X=X+1=2
。序号为收到的确认序号=Z
。
第三次挥手:服务器关闭与客户端的连接,发送一个
FIN
。标志位FIN
和ACK
置为1
,序号为Y=1
,确认序号为X=2
。
第四次挥手:客户端收到服务器发送的
FIN
之后,发回ACK
确认(标志位ACK=1
),确认序号为收到的序号加1,即Y+1=2
。序号为收到的确认序号X=2
。
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ Linux 高性能服务器编程:TCP二11/24
- ♥ CAN-BUS协议11/28
- ♥ Objective-C学习记述二10/01
- ♥ QUIC协议相关学习一03/24
- ♥ 网络相关11/21
- ♥ HTTP协议相关学习一03/22