Python 网络编程之TCP详细讲解
【一】传输层
【1】概念
- 传输层是
OSI
五层模型中的第四层,负责在网络中的两个端系统之间提供数据传输服务 - 主要协议包括**
TCP
(传输控制协议)和UDP
(用户数据报协议)**
【2】功能
- **端到端通信:**传输层负责在源和目标主机之间建立、维护和终止通信。
- 分段和重组: 将上层应用层传递下来的数据进行分段,以适应网络的传输要求,并在目标主机上将这些分段重组成完整的消息。
- 错误检测与纠正: 提供可靠的数据传输,通过序号、确认和重传等机制实现。
【3】协议
TCP
(传输控制协议): 提供可靠、面向连接的服务。通过三次握手建立连接,使用序号和确认号来保证数据的可靠传输,还包括流量控制和拥塞控制等机制。UDP
(用户数据报协议): 提供无连接、不可靠的服务。适用于对实时性要求较高的应用,如音频和视频传输。UDP
较轻量,但不提供数据的可靠性和顺序性。
【4】端口
- 传输层使用端口来标识不同的应用程序。端口分为源端口和目标端口,用于区分同一主机上的不同应用和区分不同主机上的应用。
TCP
和UDP
协议都使用端口号,共有65535个端口号,其中0到1023号为众所周知的端口号,用于标识一些常见的服务。
【二】TCP协议
【1】三次握手
(1)理解过程
- 握手是为了建立连接,建立连接是建立通道的过程,连接应该是双向的,需要发送请求和同意请求,那么理论上来说至少需要四次沟通交流才能建立连接,那为什么说是三次握手呢?
- 我们画图来说一说:
- 四次握手过程:
- 在
time0
时,客户端向服务端发送连接请求 - 在
time1
时,服务端收到了客户端发来的连接请求,此时返回同意连接的信息 - 在
time2
时,客户端收到了服务端的同意信息,那么此时客户端向服务端发送信息的通道建成 - 在
time3
时,服务端又需要向客户端发送消息,但是向客户端发送信息的通道并没有建成,所以向客户端发送连接请求 - 在
time4
时,客户端收到连接请求,向服务端发送了同意信息 - 在
time5
时,服务端收到同意信息,那么此时服务端向客户端发送信息的通道建成,双方都可以互相发送消息
- 在
- 网络传输需要时效性,这四次握手中是不是有个很明显的浪费时间过程,服务端同意连接的时候不是也可以发发送连接吗?所以三次握手来了
- 三次握手过程:
- 在
time0
时,客户端向服务端发送连接请求 - 在
time1
时,服务端收到了客户端发来的连接请求,此时返回同意连接的信息(同意客户端可以向服务端发送信息),但是服务端也需要向客户端发送信息,所以跟着发送了向客户端连接的请求 - 在
time2
时,客户端收到了服务端同意的信息,那么客户端向服务端发送消息的通道建立完成,还看到了服务端的连接请求,所以又向服务端发送了同意连接的信息 - 在
time3
时,服务端收到了同意连接的信息,此时双方就可以互相发送信息了
- 在
(2)正式讲解
-
特殊文字说明:
SYN
表示同步请求,seq
表示序列号ACK
表示确认通知,ack
表示确认号
-
三次握手的详细步骤
- 第一次握手:
- 客户端向服务端发送一个
TCP
报文,标志位设置为SYN
,表示发送连接请求 - 报文包含一个初始序列号(
ISN
),用于后续数据的序列化
- 客户端向服务端发送一个
- 第二次握手:
- 服务端接收到客户端的SYN报文后,回复一个TCP报文,标志位设置为SYN和
ACK
- 报文中包含服务端的初始序列号(
ISN
)和确认号(ACK
),确认号是客户端的序列号加一
- 服务端接收到客户端的SYN报文后,回复一个TCP报文,标志位设置为SYN和
- 第三次握手:
- 客户端接收到服务端的SYN和
ACK
报文后,向服务端发送一个TCP报文,标志位设置为ACK
- 报文中的确认号(
ACK
)设置为服务端的序列号加一,还有收到的确认号当作序列化返还回去
- 客户端接收到服务端的SYN和
- 第一次握手:
-
为什么要三次握手
- 第一次握手是客户端告诉服务端他想建立连接,同时告知自己的初始序列号
- 第二次握手是服务端收到请求后同意建立连接,并提供自己的初始序列号
- 第三次握手是客户端收到同意后再次确认,确保双方都正确同步了序列号,连接可以安全建立
【2】四次挥手
(1)理解过程
- 挥手是断开连接的过程,那么正常来说也应该要有四次挥手,连接的过程中可以时间优化只需要三次即可,那么为什么说是四次挥手呢?
- 因为在服务端收到要断开的请求时,可以先向客户端发送同意断开的信息,让客户端到服务端的信息通道先关闭;但是此时服务端向客户端发送信息的通道任然可能还有数据信息在传输,此时这个通道是不能关闭的,需要服务端完成向客户端发送的所有内容,才可以关闭这条通道
(2)正式讲解
- 四次挥手详细步骤
- 第一次挥手:
- 客户端向服务端发送一个
TCP
报文,标志位设置为FIN
,表示客户端不再发送数据 - 客户端进入
FIN_WAIT_1
状态,等待服务端的确认
- 客户端向服务端发送一个
- 第二次挥手:
- 服务端收到客户端发来的FIN报文后,回复一个
TCP
报文,标志位设置为ACK
,确认客户端的FIN
- 服务端进入
CLOSE_WAIT
状态,表示接收到了关闭连接的请求
- 服务端收到客户端发来的FIN报文后,回复一个
- 第三次挥手:
- 服务端向客户端发送一个
TCP
报文,标志位设置为FIN和ACK
,表示服务端也不在发送数据 - 服务端进入
LAST_ACK
状态,等待客户端的最后确认
- 服务端向客户端发送一个
- 第四次挥手:
- 客户端接收到服务端的FIN报文后,回复一个
TCP
报文,标志位设置为ACK
,确认服务端的FIN
- 客户端进入
TIME_WAIT
状态,等待可能可能出现的延迟报文
- 客户端接收到服务端的FIN报文后,回复一个
- 第一次挥手:
【三】UDP协议
-
UDP
是一种无连接、简单、轻量级的传输层协议 -
与
TCP
不同,UDP
不提供连接的可靠性和流控制,而是专注于尽可能快速地传输数据 -
适用场景:实时音频和视频传输、在线游戏等
原文地址:https://blog.csdn.net/weixin_48183870/article/details/135615440
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!