Socke与Tcp(什么是Socket?Tcp认识,三次握手四次挥手,保护机制)

1.什么是Socket

Socket又叫套接字,是一个抽象层,应用程序可以通过它发送或接收数据。套接字允许应用程序将I/O插入到网络中,并于网络中其他应用程序进行通行。网络套接字是IP地址和端口的结合。

Socket不是一个具体的物件也不像http类的通信协议,可以把它看成一组基于TCP和UDP通信协议的接口;把复杂的TCP/IP协议族隐藏在Socke接口后面,用Socket去组织数据;

TCP/IP分层简化图如下:现在就可以很形象的了解到底什么是Socket

 2.OSI和TCP/IP参考模型

             

3.TCP

1.TCP/IP:传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网设计的,追求准确率

是一种面向连接的,可靠的,基于字节流的传输层通信协议。

2.如何理解面向连接,可靠,字节流?

面向连接:意味着Tcp是1点对点之间的通信,不能想Udp那样可以一个主机同时向多个主机发送消息,也就是一对多情形;

可靠的:无论网络连接路如何变化,Tcp都可以保障报文能够到达接收端;

字节流:基于字节流,意味着无论我们消息有多大都可以进行传输。并且消息是有序的,当前一个消息没有收到的时候,即使它收到了后面的字节,那么也不会扔给应用层处理,同时对重复的报文会自动丢弃;

3.为什么要用Tcp协议?

因为ip层是不可靠的,因此如果需要保证网络数据包的可靠性,就必须要通过传输层的Tcp协议来保证。

4.三次握手,四次挥手

注意:(三次握手,四次挥手都是Socket在建立的时候根据选择的协议确定好的)

三次握手:下面两张图片可以很好的帮助理解

  •  服务器与客户端均处于Close状态;
  • 服务端现主动监听某端口,处理Listen状态;
  • 客户端发送SYN报文:seq=x,SYN=1;
  • 服务端回复SYN+ACK报文:seq=x,ack=x+1,SYN=1,ack=x+1
  • 客户端回复ACK报文:ack=x+1,ack=x+1;

说白了就一段对话:socket相当于物流公司,作为发送方先去物流公司确定服务方式(Tcp和Udp);对于Tcp,物流公司要确定接受方是否会接受,不然不会发送,大致对话内容:

物流:你好?你有朋友要给你寄礼物,你收吗?

接受端:收,什么时候发?

物流:现在就发

而四次挥手是在三次握手的基础上继续发生

物流:货物已发送

接受端:好的

接受端:获取收到,可以结案物流了

物流:好的,公司结案

 四次挥手:

               

  • 服务器与客户端均处于ESTABLISHED状态
  • 客户端打算关闭连接,发送一个 FIN 报文,进入 FIN_WAIT_1 状态。
  • 服务端回复 ACK报文,进入 CLOSED_WAIT 状态。
  • 客户端收到 ACK 应答报文后,进入 FIN_WAIT_2 状态。
  • 服务端处理完数据后,向客户端发送 FIN 报文,进入 LAST_ACK 状态。
  • 客户端回复一个 ACK 应答报文,之后进入 TIME_WAIT 状态
  • 服务器收到 ACK 应答报文后,进入了 CLOSE 状态,服务端完成连接的关闭。
  • 客户端在经过 2MSL 一段时间后,自动进入 CLOSE 状态,客户端也完成连接的关闭。

 5.为什么要三次挥手,四次握手?

        三次握手的目的是“为了防止已经失效的连接请求报文段突然又传到服务端,因而产生错误”

        客户端发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达服务器。本来这是一个早已失效的报文段。但服务器收到此失效的连接请求报文段后,就误认为是客户端再次发出的一个新的连接请求。于是就向客户端发出确认报文段,同意建立连接。

        假设不采用“三次握手”,那么只要服务器发出确认,新的连接就建立了。由于现在客户端并没有发出建立连接的请求,因此不会理睬服务器的确认,也不会向服务器发送数据。但服务器却以为新的运输连接已经建立,并一直等待客户端发来数据。这样,服务器的很多资源就白白浪费掉了。

        四次挥手的目的是为了保证连接的可靠传输,防止未传输完成而导致字节丢失。

        TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议

        首先客户端发送fin给服务器端,告诉自己没有数据要传送了,服务器端收到后发送对应的ack报文段给客户端,告诉他我知道了,不过这次服务器端还可以向客户端传送数据,当服务器端没有要传送的数据后就发送fin给客户端,客户端收到后发送对应ack给服务武器端,告诉他我知道了,然后双方断开链接。
 

6.四次挥手中的TIME_WAIT 状态

首先:只有主动关闭连接的一方,才会有TIME_WAIT 状态;

需要TIME_WAIT的原因:

1.防止相同的端口连接时,服务器收到的是停留在网络间的数据包

2.保证被动连接的一方能被正确的关闭。

7.Tcp保活机制

定义一个时间段,在这个时间段内,如果没有任何连接相关的活动,TCP保活机制会开始作用,每隔一个时间间隔,发送一个探测报文,该探测报文包含的数据非常少,如果连续几个探测报文都没有得到响应,则认为当前的TCP 连接已经死亡,系统内核将错误信息通知给上层应用程序。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答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三次握手四次挥手,从而建立和断开网络连接。这对于实现网络通信和数据传输非常重要。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薄荷撞~可乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值