【socket(套接字)&TCP的三次握手、四次挥手】学习笔记

TCP/IP四层模型

了解socket之前,有必要先了解一下TCP/IP四层模型,四层模型的大致内容如下图所示,详细了解可以点击此处转跳。

在这里插入图片描述

Socket是什么呢?

SocketTCP/IP四层模型中位于应用层与传输层之间,是一层抽象层,一组接口。在设计模式中,Socket是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
接口可以被理解为是一个可被调用的函数,使用者只需了解如何调用,无需了解函数的内部复杂的逻辑,便于使用者的快速开发。
SocketTCP/IP四层模型的关系如下:

在这里插入图片描述

Socket运行流程

Socket的运行分几个步骤,每个步骤都对应一个接口。

步骤(函数)描述
socket()函数socket对象初始化
bind()函数将唯一的网络地址赋给socket。这个唯一的地址就像是名片,身份证,通信双方可以通过这个地址来确认彼此
listen()函数监听socket对象。就像是平时打电话,要想接收信息,你就要时刻将话筒贴在耳边去监听电话的另一头
accept()函数接收函数。要想建立连接,就需要先确认对方此刻空闲,可以连接。接收函数就是用来接收对方的空闲应答的
connect()函数双方通过connect()函数连接,构建交流的“桥梁”
read()、write()函数用于实现信息的交互
close()函数用于结束信息的交互,关闭沟通的“桥梁”

Socket的信息交互时序图如下:

在这里插入图片描述

TCP的报文结构

在这里插入图片描述

数据名称描述
源端口、目的端口各占2个字节,分别写入源端口号和目的端口号
序号占4个字节。TCP是面向字节流的,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。故该字段也叫做“报文段序号”
确认序号占4个字节,是期望收到对方下一个报文段的第一个数据字节的序号。若确认序号=N,则表明:到序号N-1为止的所有数据都已正确收到
数据偏移占4位,表示TCP报文段的首部长度。注意,“数据偏移”的单位是32位字(即以4字节长的字为计算单位)。故TCP首部的最大长度为60字节
保留占6位,保留为今后使用,目前置为0
紧急URG当URG=1,表明紧急指针字段有效。这时发送方TCP就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍是普通数据
确认ACK当ACK=1时,确认字段才有效。当ACK=0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置1
推送PSH接收方TCP收到PSH=1的报文段,就尽快地交付给接收应用进程,而不再等到整个缓存都填满了后再向上交付
复位RST当RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立运输连接
同步SYN在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN=1和ACK=1。故SYN置为1,就表示这是一个连接请求和连接接收报文
终止FIN用来释放连接。当FIN=1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接
窗口占2个字节。窗口值作为接收方让发送方设置其发送窗口的依据
检验和占2字节。检验和字段检验的范围包括首部和数据这两部分
紧急指针占2字节。紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数

在这里插入图片描述

TCP三次握手连接流程

客户端 服务器 SYN SYN,ACK ACK 客户端 服务器
  • 第一次握手:客户端主动打开,发送连接请求报文段,将SYN标识位置为1。
  • 第二次握手:服务器收到SYN报文段进行确认(ACK),将SYN标识位置为1,ACK置为1,这个状态被称为半连接状态。
  • 第三次握手:客户端再进行一次确认(ACK),将ACK置为1(此时不用SYN)。

三次握手的目的

第一次:让服务器知道,从客户端到服务器的连接是通的。(客户端对服务器说:我想给你发数据)
第二次:让客户端知道,从服务器到客户端的连接是通的。(服务器对客户端说:我能收到,你发吧 — 确保上行通道)
第三次:让服务器知道,从服务器到客户端的连接是通的。(客户端对服务器说:我知道你收到我的请求了,那我发了 — 确保下行通道)

TCP四次挥手(握手)断开流程

客户端 服务器 FIN ACK FIN ACK 客户端 服务器

四次挥手的目的

因为对于断开链接,发送方和接收方都需要获取对方的终止信号(FIN)和对终止的确认信号(ACK),所以需要四次挥手。
第一次:客户端对服务器说:到点了,我要走啦。
第二次:服务器对客户端说:好吧,我知道你要走了。
第三次:服务器对客户端说:那我也走啦。
第二次:客户端对服务器说:好,我也知道你要走了。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在Windows上使用Python实现TCP三次握手四次挥手如下: 1. 三次握手三次握手是建立TCP连接的过程,主要涉及到客户端和服务器之间的三个步骤。 - 第一步:客户端向服务器发送一个SYN包(SYN=1,ACK=0),表示请求建立连接。 - 第二步:服务器收到SYN包后,向客户端发送一个SYN+ACK包(SYN=1,ACK=1),表示确认连接请求,并同时发送一个与客户端约定好的初始序列号。 - 第三步:客户端收到服务器的SYN+ACK包后,向服务器发送一个ACK包(SYN=0,ACK=1),表示确认连接建立。 2. 四次挥手四次挥手TCP连接的关闭过程,主要涉及到客户端和服务器之间的四个步骤。 - 第一步:客户端向服务器发送一个FIN包,表示主动关闭连接。 - 第二步:服务器收到客户端的FIN包后,返回一个ACK包,确认收到FIN包。 - 第三步:当服务器准备好关闭连接时,发送一个FIN包给客户端。 - 第四步:客户端收到服务器的FIN包后,发送一个ACK包,确认收到FIN包并关闭连接。 在Python中,可以使用socket模块实现TCP三次握手四次挥手。具体代码如下所示: ```python import socket # 三次握手 def three_way_handshake(): server_ip = '服务器IP地址' server_port = 8080 # 客户端向服务器发起连接请求 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect((server_ip, server_port)) # 第一次握手:发送SYN包给服务器 client.send(b'SYN') # 第二次握手:接收服务器的SYN+ACK包 response = client.recv(1024) if response == b'SYN+ACK': # 第三次握手:向服务器发送ACK包确认连接建立 client.send(b'ACK') # 连接建立成功 print('TCP连接建立成功') # 关闭连接 client.close() # 四次挥手 def four_way_wave(): server_ip = '服务器IP地址' server_port = 8080 # 客户端向服务器发起连接请求 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect((server_ip, server_port)) # 第一次挥手:发送FIN包给服务器 client.send(b'FIN') # 第二次挥手:接收服务器的ACK包 response = client.recv(1024) if response == b'ACK': # 第三次挥手:接收服务器的FIN包 response = client.recv(1024) if response == b'FIN': # 第四次挥手:向服务器发送ACK包确认关闭连接 client.send(b'ACK') # 连接关闭成功 print('TCP连接关闭成功') # 关闭连接 client.close() ``` 以上就是在Windows平台上使用Python实现TCP三次握手四次挥手的方法。需要根据实际情况修改服务器的IP地址和端口号。 ### 回答2: 在Windows中,可以使用Python来实现TCP三次握手四次挥手三次握手是建立TCP连接的过程。首先,客户端发送一个SYN(同步)数据包给服务器,其中包含自己的初始序列号。服务器收到后,回复一个SYN-ACK(同步-确认)数据包,其中包含自己的初始序列号和确认号(即加1)。最后,客户端向服务器发送一个ACK(确认)数据包,其中确认号为服务器发来的序列号加1。这样,TCP连接就建立了。 具体的Python代码如下: ```python import socket def handshake(): client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_address = ('localhost', 8080) client_socket.connect(server_address) # 第一次握手:客户端发送SYN client_socket.send(b'SYN') # 第二次握手:服务器发送SYN-ACK data = client_socket.recv(1024) if data == b'SYN-ACK': # 第三次握手:客户端发送ACK client_socket.send(b'ACK') print('TCP连接已建立') client_socket.close() handshake() ``` 四次挥手是关闭TCP连接的过程。首先,客户端发送一个FIN(结束)数据包给服务器,表示不再发送数据。服务器收到FIN后,回复一个ACK确认收到,并在接下来的某个时间发送自己的FIN。客户端收到服务器的FIN后,回复一个ACK确认收到,然后等待一段时间,最后关闭连接。 具体的Python代码如下: ```python import socket def close_connection(): client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_address = ('localhost', 8080) client_socket.connect(server_address) # 第一次挥手:客户端发送FIN client_socket.send(b'FIN') # 第二次挥手:服务器发送ACK data = client_socket.recv(1024) if data == b'ACK': # 第三次挥手:服务器发送FIN data = client_socket.recv(1024) if data == b'FIN': # 第四次挥手:客户端发送ACK client_socket.send(b'ACK') print('TCP连接已关闭') client_socket.close() close_connection() ``` 以上就是使用Python在Windows中实现TCP三次握手四次挥手的步骤和代码。 ### 回答3: TCP是一种可靠的传输控制协议,它通过三次握手建立连接和四次挥手断开连接。在Windows系统上,可以使用Python编写代码来实现TCP三次握手四次挥手三次握手的实现如下: 1. 创建服务器端和客户端的Socket对象。 2. 服务器端监听指定的端口,等待客户端连接。 3. 客户端发起连接请求,向服务器发送SYN包。 4. 服务器端收到SYN包后,回复一个SYN-ACK包,确认客户端的连接请求,并分配一个通信端口。 5. 客户端收到SYN-ACK包后,发送一个ACK包,确认服务器的连接确认。 6. 服务器收到ACK包后,完成三次握手,双方建立了可靠的连接。 四次挥手的实现如下: 1. 客户端发送一个FIN包,表示要断开连接。 2. 服务器收到FIN包后,发送一个ACK包,确认客户端的断开请求。 3. 服务器发送一个FIN包,表示服务器也要断开连接。 4. 客户端收到FIN包后,发送一个ACK包,确认服务器的断开请求。 5. 服务器收到ACK包后,完成四次挥手,双方断开了连接。 通过编写Python代码可以实现TCP三次握手四次挥手操作,具体步骤如上所述。在Windows系统上,可以使用Python的socket模块来实现Socket对象的创建和数据传输。需要注意的是,在编写代码时,要遵循TCP协议的规定,确保握手和挥手的顺序和数据包的格式正确。 这样,在Windows系统上,可以使用Python来实现TCP三次握手四次挥手,从而建立和断开网络连接。这对于实现网络通信和数据传输非常重要。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值