python — TCP协议与UDP协议

1. TCP协议 / UDP协议

1.1 TCP协议

  • 1.可靠、慢、全双工通信

  • 2.建立连接的时候 : 三次握手

  • 3.断开连接的时候 : 四次挥手

  • 4.在建立起连接之后

    • 发送的每一条信息都有回执

    • 为了保证数据的完整性,还有重传机制

  • 5.长连接 :会一直占用双方的端口

  • 6.IO(input,output)操作,输入和输出是相对内存来说的

    • write / send -----> 输出 output

    • read / recv ------> 输入 input

  • 7.能够传递的数据长度几乎没有限制

1.2 UDP协议

  • 1.无连接的 速度快
  • 2.可能会丢消息
  • 3.能够传递的数据的长度是有限的,是根据数据传递设备的设置有关系

1.3 应用场景

  • TCP 文件的上传下载(发送邮件、网盘、缓存电影)
  • UDP 即时通信类的(qq、微信、飞秋)

2. osi七层模型 /osi五层协议

osi七层模型 osi五层协议 协议 物理设备
应用层
表示层
会话层
(三层总结成一层)
五层 应用层 http / https / ftp / smtp 协议
python代码:hello
传输层 四层 传输层 tcp协议 / udp协议 端口 四层路由器、四层交换机
网络层 三层 网络层 ipv4 / ipv6 协议 (三层)路由器、三层交换机
数据链路层 二层 数据链路层 mac地址 arp协议 网卡、(二层)交换机
物理层 一层 物理层

3. socket(套接字)

socket 是一个工作在应用层和传输层之间的抽象层。

  • 帮助我们完成了所有信息的组织和拼接
  • sokcet对于程序员来说 已经是网络操作的底层了

socket历史:

  • (初期)基于文件通信 -------- 完成同一台机器上的两个服务之间的通信的
  • (现在)基于网路通信 -------- 完成了多台机器之间的多个服务通信

3.1 socket用于TCP协议

# server.py 服务端
import socket

sk = socket.socket()  
# socket()参数中:family(基于……通信)=AF_INET(网络通信), type(协议)=SOCK_STREAM(TCP协议),TCP协议默认不用写,如果想要写协议必须是:type=socket.SOCK_STREAM
sk.bind(('192.168.12.25',9000))
sk.listen()
while True:
    conn,addr = sk.accept()
    while True:
        msg = conn.recv(1024)
        if msg.decode('utf-8').upper() == 'Q':
            break
        print(msg.decode('utf-8'))
        cont = input('内容(输入Q断开):')
        conn.send(cont.encode('utf-8'))
        if cont.upper() == 'Q':
            break
    conn.close()
sk.close()

# client.py 客户端
import socket

sk = socket.socket()
sk.connect(('127.0.0.1',9000))
while True:
    msg = sk.recv(1024)
    if msg.decode('utf-8').upper() == 'Q':
        break
    print(msg.decode('utf-8'))
    cont = input('内容(输入Q断开):')
    sk.send(cont.encode('utf-8'))
    if cont.upper() == 'Q':
        break
sk.close()

sk.accept() 与 sk.connect() 是建立三次握手的过程

3.2 socket用于UDP协议

# server.py 服务端
import socket

sk = socket.socket(type = socket.SOCK_DGRAM) # UDP协议必须加上 type=socket.SOCK_DGRAM
sk.bind(('127.0.0.1',9000))
while True:
    msg,client_addr = sk.recvfrom(1024) # recvfrom用于不知道对方ip时,获取到ip给client_addr
    msg = msg.decode('utf-8')
    print(msg)
    msg1 = input('>>>').encode('utf-8')
    sk.sendto(msg1,client_addr)
sk.close()

# client.py 客户端
import socket

sk = socket.socket(type = socket.SOCK_DGRAM)
while True:
    inp = input('>>>').encode('utf-8')
    sk.sendto(inp,('127.0.0.1',9000))
    msg = sk.recv(1024).decode('utf-8') # 这里不需要使用recvfrom,因为知道对方ip地址
    print(msg)

sk.close()
原文地址:https://www.cnblogs.com/yangjie0906/p/10826112.html