socket底层工作原理解释,tcp三次握手与四次挥手

import socket # 错误1:自建模块名称尽量不要和导入的库名称相同

phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 以下的收发包都是基于tcp方式
# 实例化一个对象

phone.bind(('127.0.0.1', 8000)) # IP地址信息和端口号需以元组的形式作为参数
# 绑定IP和端口信息

phone.listen(10) # 指定backlog半链接池多大(最大可以挂起10个链接);在服务器上这个值是还需要调整的(测试的时候小一点可以);如果这个数值过小,很容易被占满,黑客攻击请求过多那么正常请求就无法响应;防止SYN洪水攻击的手段之一就是增大半链接池,另一点则是缩小返回次数
# 监听数量

conn, addr = phone.accept() # 相当于拿到一个tcp链接

msg = conn.recv(1024) # 数据传输
print(msg)
# 收到客户端发送到的信息

conn.send(msg.upper())
# 发信息给客户端

conn.close() # 断链接四次挥手(关闭三次握手)
# 断开链接

phone.close() # 关闭socket,把程序给关了

# 错误2:OSError: [WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。当day70_s这个代表服务端文件正在运行时,再启动
# day71_s这个代表服务端的文件,那么就会报这个异常;异常信息代表这个端口被占用,目前不能使用(mac笔记本经常会出现这个问题)
# 另一个模块代码
import socket

c1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 实例化一个对象

c1.connect(('127.0.0.1', 8000)) # # IP地址信息和端口号需以元组的形式作为参数
# 连接服务端

c1.send('kobe'.encode('utf-8')) # 必须以二进制的形式进行发送消息
# 发送信息给服务端

data = c1.recv(1024)
print(data)
# 收到服务端发送的信息

 建链接三次握手:

SYN洪水攻击,利用tcp协议设计的漏洞进行攻击,第①步的操作是C端发送给S端的SYN连接请求,而S端也会进行一 一回应请求,当C端不予回应S端仍会再尝试回应连接请求,当这样的假SYN连接请求非常多时,会消耗服务器资源。

backlog:半链接池(没有把这一链接建立成功)--->>>讲SYN连接请求放置在一块,服务端响应SYN连接请求从半链接池中拿。

完整的链接,从客户端开始发送链接,到服务端状态为ESTABLISHED为止;半连接,服务端状态一直为SYN_RCVD。

数据传输:

断开链接四次挥手:

 

主动断开链接状态一定是客户端发起的吗?不一定,从为什么要断开链接上分析?数据传完断链接,谁传完谁断,一定是客户端先把链接断开吗?不一定。

为什么建链接要3次握手,而断链接却要4次挥手?因为建立链接是在发送数据之前,而断开链接是在发送数据之后,C端数据发送完毕不代表S端数据也发送完毕,所以断开链接要4次挥手。

大并发情况下,服务端会有大量TIME_WAIT状态,因为服务端根本不会保存客户端链接,服务端把数据发完后,立马主动断开链接,为了节省自己的资源,(基本上是服务端先断开链接)。

while True: print('studying...')
原文地址:https://www.cnblogs.com/xuewei95/p/14782122.html