目录
--having--
TCP协议简介
- TCP(Transmission Control Protocol,传输控制协议)是面向连接的、可靠的、基于字节流的传输层协议。
- 它提供了可靠的端到端通信,能够保证数据完整性、顺序以及避免丢包等问题。
- TCP使用的流量控制、拥塞控制和可靠的确认机制使其成为大多数网络通信的首选协议。
在传输数据之前,TCP连接需要通过三次握手建立连接,在传输数据结束后,通过四次挥手断开连接。
协议解释:
UDP协议
- UDP,在传送数据前不需要先建立连接
- 远程的主机在收到UDP报文后也不需要给出任何确认。
- 虽然UDP不提供可靠交付,但是正是因为这样,省去和很多的开销,使得它的速度比较快,比如一些对实时性要求较高的服务,就常常使用的是UDP。
- 对应的应用层的协议主要有DNS,TFTP,DHCP,SNMP,NFS等。
TCP协议
-
TCP,提供面向连接的服务
-
在传送数据之前必须先建立连接,建立连接就是确保双方的网络是通畅的
-
数据传送完成后要释放连接,而且每发送一个数据包都要收到确认信息才会发送另外一个数据包。
-
因此TCP是一种可靠的的运输服务
-
但是正因为这样,不可避免的增加了许多的开销
-
所以速度相比UDP就慢一些,比如确认,流量控制等
-
对应的应用层的协议主要有 SMTP,TELNET,HTTP,FTP等
常用TCP协议端口号及应用程序
-
HTTP - 端口号 80
用于Web浏览器与Web服务器之间的通信,传输网页内容。 -
HTTPS - 端口号 443
用于安全的HTTP通信(通过TLS/SSL加密)。广泛应用于银行、电子商务等需要数据保密的场合。 -
FTP - 端口号 21
文件传输协议,用于在计算机之间传输文件。 -
FTPS - 端口号 990
FTP的安全版本,通过SSL/TLS加密进行数据传输。 -
SSH - 端口号 22
安全的Shell协议,提供远程登录、远程执行命令以及数据传输的安全通道。 -
Telnet - 端口号 23
远程登录协议,允许用户通过网络登录到远程计算机。由于缺乏加密,现在通常不推荐使用。 -
SMTP - 端口号 25
简单邮件传输协议,用于电子邮件的发送。 -
SMTPS - 端口号 465
SMTP的安全版本,使用SSL/TLS加密传输电子邮件。 -
POP3 - 端口号 110
邮局协议版本3,用于从邮件服务器下载电子邮件到本地客户端。 -
IMAP - 端口号 143
网络邮件访问协议,允许客户端从邮件服务器读取邮件内容,并保持邮件副本在服务器上。 -
IMAPS - 端口号 993
IMAP的安全版本,使用SSL/TLS加密传输邮件数据。 -
DNS - 端口号 53
域名系统协议,负责将域名转换为IP地址(如www.example.com → 192.0.2.1)。 -
MySQL - 端口号 3306
用于MySQL数据库的通信,客户端与数据库服务器之间的连接。 -
PostgreSQL - 端口号 5432
用于PostgreSQL数据库的通信。 -
RDP - 端口号 3389
远程桌面协议,用于远程控制Windows计算机。 -
SFTP - 端口号 22
安全文件传输协议,通常与SSH协议一起使用。 -
MSSQL - 端口号 1433
用于Microsoft SQL Server的通信。 -
LDAP - 端口号 389
轻量目录访问协议,用于查询和修改目录服务中的信息。 -
LDAPS - 端口号 636
LDAP的安全版本,使用SSL/TLS加密传输。 -
SNMP - 端口号 161
简单网络管理协议,用于监控和管理网络设备。 -
IRC - 端口号 6660-6669
Internet Relay Chat协议,用于即时聊天服务。 -
VNC - 端口号 5900
虚拟网络计算协议,用于远程桌面控制。 -
BGP - 端口号 179
边界网关协议,用于自治系统之间交换路由信息。 -
NTP - 端口号 123
网络时间协议,用于同步计算机系统的时间。 -
Kerberos - 端口号 88
用于身份验证和授权服务,常用于企业环境中的单点登录(SSO)。 -
TFTP - 端口号 69
简单文件传输协议,通常用于网络设备的启动和配置文件的传输。
TCP的11种状态
TCP连接的生命周期通过不同的状态进行控制。
每个连接都会经历这些状态,以确保连接的建立、数据传输以及最终的关闭。
下面是TCP的11种状态及其含义:
-
LISTEN: 服务器端在等待客户端请求的连接。处于此状态的服务器正在监听端口。
-
SYN_SENT: 客户端发送SYN请求,等待服务器确认连接请求。这个状态通常在客户端发起连接时出现。
-
SYN_RECV: 服务器接收到客户端的SYN请求并发送了SYN+ACK响应,等待客户端的确认。
-
ESTABLISHED: 客户端与服务器建立了连接,双方可以开始数据传输。在这个状态下,数据已经可以正常传送。
-
FIN_WAIT_1: 客户端或服务器发起连接的关闭请求,发送一个FIN报文,进入该状态,等待对方确认。
-
FIN_WAIT_2: 在接收到对方的确认后,进入此状态,表示对方已经准备好关闭连接,等待对方发出关闭请求。
-
CLOSE_WAIT: 另一方发起连接关闭请求并发送FIN报文,处于此状态的主机等待应用层关闭连接并发送FIN报文。
-
CLOSING: 双方几乎同时发送了FIN报文,处于此状态的主机等待对方的确认。
-
LAST_ACK: 此状态表明已经发送了关闭连接的请求(FIN),并且正在等待对方的最后确认。
-
TIME_WAIT: 主机在接收到对方的确认后进入此状态,它需要保持一定的时间,以确保对方收到了关闭连接的报文。
-
CLOSED: 连接完全关闭,处于此状态表示连接的生命周期已结束。
TCP三次握手(3-Way Handshake)
简要说明
三次握手是TCP协议建立连接的过程,用于确保客户端和服务器之间的通信通道正常,数据可以可靠地传输。具体过程如下:
-
客户端 -> 服务器(SYN): 客户端向服务器发送一个SYN包(同步序列号),请求建立连接。SYN包中包含一个初始的序列号(Seq = x)。
-
服务器 -> 客户端(SYN + ACK): 服务器收到客户端的SYN包后,回复一个SYN + ACK包,表示确认建立连接,并给出服务器端的初始序列号(Seq = y),同时确认客户端的SYN包(Ack = x+1)。
-
客户端 -> 服务器(ACK): 客户端收到服务器的SYN + ACK包后,发送一个ACK包,确认服务器的序列号(Ack = y+1),此时连接建立,数据传输可以开始。
三次握手过程中的数据包:
-
SYN包(同步包)
-
标志位:SYN=1, ACK=0
-
作用:发起连接请求,携带初始序列号(ISN)
-
示例:Client → Server,序列号=1000
-
-
SYN-ACK包
-
标志位:SYN=1, ACK=1
-
作用:确认收到SYN,返回服务端初始序列号
-
示例:Server → Client,确认号=1001,序列号=5000
-
-
ACK包
-
标志位:ACK=1
-
作用:确认连接建立完成
-
示例:Client → Server,确认号=5001
-
三次握手过程的示意图:
客户端 服务器
| |
|--- SYN ----> | // 客户端发送SYN请求
| |
|<-- SYN + ACK ---- | // 服务器回应SYN+ACK
| |
|--- ACK ----> | // 客户端发送确认ACK,连接建立
| |
三次握手详细过程
-
TCP服务器进程先创建传输控制块TCB
-
时刻准备接受客户进程的连接请求,此时服务器就进入了LISTEN(监听)状态;
-
-
TCP客户进程也是先创建传输控制块TCB
-
然后向服务器发出连接请求报文。
-
这是报文首部中的同部位SYN=1,同时选择一个初始序列号 seq=x。
-
此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。
-
TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。
-
-
TCP服务器收到请求报文后,如果同意连接,则发出确认报文。
-
确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1。
-
同时也要为自己初始化一个序列号 seq=y,此时,TCP服务器进程进入了SYN-RCVD(同步收到)状态。
-
这个报文也不能携带数据,但是同样要消耗一个序号。
-
-
TCP客户进程收到确认后,还要向服务器给出确认。
-
确认报文的ACK=1,ack=y+1,自己的序列号
-
seq=x+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。
-
TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。
-
-
当服务器收到客户端的确认后也进入ESTABLISHED状态
-
此后双方就可以开始通信了。
-
为什么TCP客户端最后还要发送一次确认呢?
-
一句话,主要防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。
-
如果使用的是两次握手建立连接。
-
假设有这样一种场景,客户端发送了第一个请求连接并且没有丢失,只是因为在网络结点中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到
-
此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。
-
此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接
-
这将导致不必要的错误和资源的浪费。
-
-
如果采用的是三次握手,就算是那一次失效的报文传送过来了。
-
服务端接收到了那条失效报文并且回复了确认报文,
-
但是客户端不会再次发出确认。
-
由于服务器收不到确认,就知道客户端并没有请求连接。
-
TCP四次挥手(4-Way Handshake)
简单解释
四次挥手是TCP协议断开连接的过程,用于确保数据传输完毕,双方正确关闭连接。具体过程如下:
-
客户端 -> 服务器(FIN): 客户端发送一个FIN包,表示客户端没有数据要发送了,请求关闭连接。
-
服务器 -> 客户端(ACK): 服务器收到客户端的FIN包后,发送一个ACK包确认收到FIN,表示可以关闭连接,但是服务器仍然可以向客户端发送数据。
-
服务器 -> 客户端(FIN): 当服务器完成数据发送后,它会发送一个FIN包给客户端,表示服务器也没有数据要发送了。
-
客户端 -> 服务器(ACK): 客户端收到服务器的FIN包后,发送一个ACK包确认收到FIN,至此,连接关闭。
四次挥手过程中的数据包:
-
客户端 -> 服务器(FIN):
- FIN标志位: 1
- 序列号: 客户端的序列号
-
服务器 -> 客户端(ACK):
- ACK标志位: 1
- 确认号: 客户端的FIN序列号 + 1
- 序列号: 服务器的序列号
-
服务器 -> 客户端(FIN):
- FIN标志位: 1
- 序列号: 服务器的序列号
-
客户端 -> 服务器(ACK):
- ACK标志位: 1
- 确认号: 服务器的FIN序列号 + 1
- 序列号: 客户端的序列号
四次挥手过程的示意图:
客户端 服务器
| |
|--- FIN ----> | // 客户端发送FIN请求
| |
|<-- ACK ---- | // 服务器确认收到FIN
| |
|<-- FIN ---- | // 服务器发送FIN,表示关闭连接
| |
|--- ACK ----> | // 客户端确认收到服务器的FIN,连接关闭
| |
详细解释:
-
断开连接需要四次挥手,数据传输完毕后,双方都可释放连接。
-
最开始的时候,客户端和服务器都是处于ESTABLISHED状态。
-
然后客户端主动关闭,服务器被动关闭。服务端也可以主动关闭。
-
------------------------------
-
客户端进程发出连接释放报文,并且停止发送数据。
-
释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1)。
-
此时,客户端进入FIN-WAIT-1(终止等待1)状态。
-
TCP规定,FIN报文段即使不携带数据,也要消耗一个序号
-
-
服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。
-
TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态
-
即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。
-
这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
-
-
客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态
-
等待服务器发送连接释放报文
-
在这之前还需要接受服务器发送的最后的数据
-
-
服务器将最后的数据发送完毕后
-
就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态
-
服务器很可能又发送了一些数据,假定此时的序列号为seq=w
-
此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
-
-
客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1
-
此时,客户端就进入了TIME-WAIT(时间等待)状态
-
注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后
-
当客户端撤销相应的TCB后,才进入CLOSED状态。
-
-
服务器只要收到了客户端发出的确认,立即进入CLOSED状态。
-
同样,撤销TCB后,就结束了这次的TCP连接。
-
可以看到,服务器结束TCP连接的时间要比客户端早一些。
-
为什么客户端最后还要等待2MSL?
-
MSL(Maximum Segment Lifetime)
-
TCP允许不同的实现可以设置不同的MSL值。
-
第一,保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失
-
站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了
-
客户端还没有给我回应,应该是我发送的请求断开报文它没有收到
-
于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文
-
接着给出回应报文,并且会重启2MSL计时器。
-
-
第二,防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。
-
客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。
-
这样新的连接中不会出现旧连接的请求报文
-
TCP总结概述
-
面向连接:TCP是面向连接的协议,在数据传输之前需要先建立连接(三次握手),并在传输完成后关闭连接(四次挥手)。
-
可靠性保证:TCP通过序列号、确认应答(ACK)机制、重传机制等,保证数据能够正确、有序地到达目标。每个数据段都有一个唯一的序列号,接收方通过确认应答来确保数据的完整性。
-
流量控制:TCP使用滑动窗口机制进行流量控制。发送方根据接收方的缓冲区大小决定每次发送的数据量,避免接收方的缓冲区溢出。
-
拥塞控制:TCP使用多种算法来控制网络拥塞,如慢启动、拥塞避免、快速重传、快速恢复等。这些算法可以动态调整数据发送的速率,避免网络过载。
-
数据传输:TCP是基于字节流的协议,数据在发送和接收过程中不会保留边界,接收方会按照数据的顺序重组字节流,恢复出原始的数据。
两个为什么
为什么建立连接是三次握手,关闭连接却是四次挥手呢
-
1、建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后
-
把ACK和SYN放在一个报文里发送给客户端。
-
-
2、而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了
-
所以己方可以立即关闭,也可以发送一些数据给对方后,
-
再发送FIN报文给对方来表示同意现在关闭连接
-
因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。
-
如果已经建立了连接,但是客户端突然出现故障了怎么办?
-
TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。
-
服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时
-
若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段以后每隔75分钟发送一若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障接着就关闭连接。
-
看图,x和y是随机序列号,不是固定的值,所以我用x和y表示了
-
总结
- 三次握手用于建立可靠的连接,确保双方可以通信。
- 四次挥手用于平稳关闭连接,确保所有数据都已传送完毕并且双方都同意断开连接。
- TCP协议通过一系列机制(如序列号、确认应答、流量控制、拥塞控制等)来确保数据的可靠传输。
通过三次握手和四次挥手,TCP能够保证端到端通信的可靠性和有效性,并且可以灵活处理各种网络状况。
喜欢本文的请动动小手点个赞,收藏一下,有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。