tcp port numbers reused出现原因_图文并茂详解TCP的3次握手+4次挥手+11种状态集

2TCP的介绍

TCP也叫传输控制协议(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。

3TCP的特点1 面向连接

✦ TCP通信需要经过创建连接数据传送终止连接三个步骤。

✦ 在通信开始之前,先建立相关的链接,才能发送数据,类似于生活中,"打电话"。

✦ 完成数据交换后,双方必须断开此连接,以释放系统资源。

✦ 这种连接是一对一的,因此TCP不适用于广播的应用程序,基于广播的应用程序请使用UDP协议。adbbc7e9d10b1aebcea27e882cb983f4.png

2 可靠传输

✦ TCP发送的每个报文段都必须得到接收方的应答才认为这个TCP报文段传输成功

✦ 发送端发出一个报文段之后就启动定时器,如果在定时时间内没有收到应答就重新发送这个报文段。

✦ TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。

✦ TCP用一个校验和函数来检验数据是否有错误,在发送和接收时都要计算校验和。

4TCP通信模型

TCP通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据,类似于生活中,"打电话"

20034c8501113542ffadd613345d684a.png

5TCP客户端构建流程

比如一个人想打10086求助人工服务。tcp的客户端要比服务器端简单很多,客户端只需要找一个电话亭,拿起电话拨打即可。

示例代码:

 1from socket import *
2
3# 创建socket
4tcp_client_socket = socket(AF_INET, SOCK_STREAM)
5
6# 目的信息
7server_ip = input("请输入服务器ip:")
8server_port = int(input("请输入服务器port:"))
9
10# 链接服务器
11tcp_client_socket.connect((server_ip, server_port))
12
13# 提示用户输入数据
14send_data = input("请输入要发送的数据:")
15
16tcp_client_socket.send(send_data.encode("gbk"))
17
18# 接收对方发送过来的数据,最大接收1024个字节
19recvData = tcp_client_socket.recv(1024)
20print('接收到的数据为:', recvData.decode('gbk'))
21
22# 关闭套接字
23tcp_client_socket.close()
6TCP服务端构建流程

f57a4ff6342fa021ab5388760d2da284.png在程序中,要完成一个tcp服务器的功能,需要的流程如下:

  1. socket创建一个套接字;

  2. bind绑定ip和port;

  3. listen使套接字变为可以被动套接字;

  4. accept取出一个客户端连接 用以服务;

  5. recv/send接收发送数据;

示例代码:

 1from socket import *
2
3# 创建socket
4tcp_server_socket = socket(AF_INET, SOCK_STREAM)
5
6# 本地信息
7address = ('', 7788)
8
9# 绑定
10tcp_server_socket.bind(address)
11
12# 使用socket创建的套接字
13tcp_server_socket.listen(128)
14
15# 如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务
16client_socket, clientAddr = tcp_server_socket.accept()
17
18# 接收对方发送过来的数据
19recv_data = client_socket.recv(1024)
20print('接收到的数据为:', recv_data.decode('gbk'))
21
22# 发送一些数据到客户端
23client_socket.send("thank you !".encode('gbk'))
24
25# 关闭为这个客户端服务的套接字
26client_socket.close()
7TCP的3次握手

SYN

请求建立连接字段:1表示与对方要进行网络连接建立 ,0 表示默认没有连接建立请求。

ACK

确认控制字段:1表示上一次发送的数据对方接收了,0 表示没有接收到上次发送的数据信息。

seq

随机序列号。

a232456a29c79aa4c7becbbba53112f1.png

8TCP的4次挥手

FIN

请求断开连接字段:1表示与对方断开网络连接,0 表示默认没有断开连接请求。

ack

随机序号回复(ack=seq+1)。

ctl

控制字段号。

68b48a5f00a60205937ff115e1dbc2d0.png

9TCP的11种状态集

7ab9fe4654ae2fe57808b965c253ddd8.png

TCP十一种状态转移总结

出现方式

出现

环境

状态名称

状态描述

TCP

服务端/客户端

CLOSED

默认初始化状态

服务端

LISTEN

建立socket,进入监听状态

客户端

SYN_SENT

发送syn报文,进入syn发送状态

服务端

SYN_RCVD

接受syn报文,并回复ack及syn报文

服务端/客户端

ESTABLISHED

接受syn报文,回复ack建立连接(客户端)

接受ack报文,建立连接(服务端)

TCP

服务端/客户端

ESTABLISHED

默认断开前初始化状态

客户端

FIN_WAIT1

发送断开请求FIN报文

服务端

CLOSE_WAIT

收到FIN后向客户端发送ACK

客户端

FIN_WAIT2

收到服务端返回的ACK报文,等待数据传输。

服务端

LAST_ACK

发送FIN断开请求报文

客户端

TIME_WAIT

回复FIN断开请求,发送ack报文

服务端/客户端

CLOSED

收到ack报文立即转换为断开状态,等待2MSL后,转变为断开状态

客户端

CLOSEING

没有收到回复FIN报文的ACK,直接收到FIN

10tcp/ip协议簇
  • 为了把全世界的所有不同类型的计算机都连接起来,就必须规定一套全球通用的协议,为了实现互联网这个目标,互联网协议族(Internet Protocol Suite)就是通用协议标准。

  • 互联网协议包含了上百种,最重要的是TCP和IP协议,所以,互联网的协议简称TCP/IP协议(族)

TCP/IP协议簇之间的关系7e0f9ad5f37e114cfe66258a6c9b5e77.png

TCP/IP协议传输示意图

635efb61eec1922e702dbad96c205dd7.png

3480812141d2730585cd04544867079e.png

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: TCP端口号被重用的原因可能是因为先前使用该端口的应用程序已经关闭或崩溃,导致该端口号变得可用。另外,一些应用程序可能会在同一台计算机上使用相同的端口号,但在不同的IP地址上进行监听,这也可能导致TCP端口号被重用。 ### 回答2: TCP端口号的重用是因为TCP连接的四元组——源IP、源端口号、目标IP、目标端口号——可以确定一个唯一的连接。但是,在TCP连接被断开后,这个四元组可以被操作系统重用,从而建立新的连接。这样做的原因是为了节省端口号的使用,避免系统占用过多的端口。 在实际应用中,TCP连接的创建和销毁频繁而快速,而TCP端口号是有限的资源。在短时间内不可能用完所有的端口号,因此操作系统可以重用已经被关闭的连接的端口号,从而降低了系统开销。 TCP端口号被重用还有另外一情况。在服务端应用程序关闭前,它还可能保留这个端口号并等待重新唤醒。这对于减少服务启动和停止的开销是非常有用的。此外,TCP端口号的重用还可以使连接建立更加快速,缩短了用户的等待时间。 需要注意的是,TCP连接的四元组不同,即使是相同的端口号也不能进行重用。例如,如果新建一个连接的源IP、源端口号与之前的连接相同,但目标IP地址或目标端口号改变了,仍视为一个新的连接,系统会为它分配一个新的端口号。只有当TCP连接的四元组完全相同,包括状态和时间戳等信息时,系统才会认为这是同一条连接的重复使用。 ### 回答3: 网络通信中的TCP协议是一面向连接通信的协议,它通过创建一条可靠的双向通信通道来进行数据传输。而TCP端口号就是用来标识每一条连接通道的。 TCP端口号是充分利用了网络资源的一项重要措施,允许多个进程同时使用网络上的同一个IP地址。在TCP协议中,每个端口号都对应着一个正在工作的进程,这些进程通过不同的端口号来实现在同一个IP地址下进行通信。 然而,在某些情况下,操作系统中的一个端口号已经被一个进程使用了,但是这个进程又被终止了,导致这个端口号就被占用了。这时候,如果另一个进程需要使用同一个端口号来进行通信,那么它就无法与网络上其他设备建立连接。为了解决这个问题,TCP协议允许端口号重用,即在一个进程结束后,其他进程仍然可以使用相同的端口号。 TCP端口号重用的出现原因主要有以下几点: 1. 提高资源利用率 端口号是有限资源,在同时需要进行大量TCP连接的情况下很容易出现资源不足的状况。为了提高资源的利用率,TCP端口号能够被重用,避免了由于资源短缺造成的连接阻塞,确保网络通信的稳定性。 2. 快速建立连接 TCP协议允许端口号被重用,当进程结束后,其他进程不需要等待操作系统释放端口号,在同一端口上可以很快的建立连接,节约了时间。 3. 允许多进程并发监听同一端口 TCP协议允许多进程并发监听同一端口,这样做可以帮助用户构建高可用性的网络服务,不因为某一个进程的故障而影响其他进程的工作。 总之,TCP端口号重用能够有效地提高网络的利用率,加快连接速度,以及保障网络稳定性。但是在实际应用中,需要注意TCP端口号重用的数和范围,以免出现数据冲突、复制等问题,影响用户体验和数据安全。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值