OSI七层协议补充与socket套节字

科技网编2023-04-05 11:462610

OSI七层协议补充与socket套节字

TCP与UDP协议都是用来规定通信方式的,数据传输过程中能够遵循的协议有很多其中TCP协议和UDP协议是较为常见的两个。

1.TCP协议

可靠传输,只要得不到认可,就重新发送数据报,直到得到对方的确认为止
1.三次握手建连接:
    建立双向通道
  问题:洪水攻击
  解决的办法:同时让大量的客户端朝服务端发送建立TCP连接的请求

2.四次挥手
  断开双向通道(中间的两步不能合并,需要有检查的时间)
注意:基于TCP协议传输的数据非常安全,因为有双向通道,基于TCP传输数据,数据不容易丢失,原因在于二次确认机制,每次发送数据都需要返回确认消息,否则在一定时间会反复发送。达到一定次数的发送,若得不到确认则删除数据。
三次握手和四次挥手也可以看成是小情侣谈恋爱的过程	
    三次握手:表白在一起
    四次挥手:决裂要分手
# 基于TCP传输数据因为有双向通道所以很安全
TCP传数据不容易丢失因为有二次确认机制,每次发送数据都需要返回确认消息,否则在一定时间会反复发送

2.UDP协议

UDP协议发送数据没有任何的通道也没有任何的限制,但是没有TCP协议传输数据来的安全(没有二次确认机制)
eg:发了消息,重要的是发了,不管别人看了没有,回没有回复

二、应用层

 应用层提供各种各样的应用层协议,这些协议嵌入我们使用的各种应用程序中,主要是程序员自己采用什么样的策略和协议
常见的协议有:HTTP,HTTPS,FTP....

三、socket套节字编程

1.套节字的作用

可以看成两个网络应用程序进行通信时,各自通信连接中的端点

2.套节字家族

基于文件类型的套节字家族
    套节字家族的名字:AF_UNIX
基于网络类型的套节字家族
    套节字家族的名字:AF_INET

3.socket代码简介

'''客户端'''
import socket

# 1.生成socket对象指定类型和协议
client = socket.socket 
# 2.通过地址链接服务端
client.connect(('127.0.0.1',8080))
# 3.直接给服务端发送消息
client.send('你好,我是客户端,你是谁'.encode('utf8'))
# 4.接收服务端发送过来的消息 1024是字节数
data = client.recv(1024)
print(data.decode('utf8'))
# 5.断开与服务端的链接
client.close 
'''服务端'''
import socket

# 1.产生一个socket对象并指定采用的通信版本和协议(TCP)
server = socket.socket 
# 2.绑定一个固定的地址(服务端必备的条件)
server.bind(('127.0.0.1',8080))
# 3.设立半连接池
server.listen(5)
# 4.等待连接
sock,addr = server.accept 
print(sock,addr)
# 5.服务
data = sock.recv(1024)
print(data.decode('utf8'))
sock.send('我是服务端,专门为您服务的'.encode('utf8'))
# 6.关闭双向通道
sock.close 
# 7.关闭服务端
server.close 

4.代码优化

'''优化客户端'''
import socket

# 1.生成socket对象指定类型和协议
client = socket.socket 
# 2.通过地址链接服务端
client.connect(('127.0.0.1',8081))
while True:
    msg = input('请输入您想要发给服务端的消息>>>').strip 
    if len(msg) == 0:
        print('不能发送空消息哦')
        continue
    # 3.直接给服务端发送消息
    client.send(msg.encode('utf8'))
    # 4.接收服务端发送过来的消息 1024是字节数
    data = client.recv(1024)
    print('来自服务端的消息>>>>',data.decode('utf8'))
    # # 5.断开与服务端的链接
    # client.close 
'''优化服务端'''
import socket

# 1.产生一个socket对象并指定采用的通信版本和协议(TCP)
server = socket.socket 
# 2.绑定一个固定的地址(服务端必备的条件)
server.bind(('127.0.0.1',8081))
# 3.设立半连接池
server.listen(5)
while True:
    # 4.等待连接
    sock,addr = server.accept 
    while True:
        try:
            # 5.服务
            data = sock.recv(1024)
            if len(data) == 0:
                break
            print(f'来自于客户端{addr}的消息>>>>',data.decode('utf8'))
            msg = input('请输入发送给客户端的消息(不能发空消息)>>>:').strip 
            sock.send(msg.encode('utf8'))
        except BaseException:
            break

四、半连接池

    当服务器在响应了客户端的第一次请求后会进入多待状态,半连接池其实就是一个容器,系统会自动将半连接放入这个容器中,可以避免连接过多
eg:server.listen(5)

评论区