zoukankan      html  css  js  c++  java
  • TCP协议和UDP协议

    TCP协议

    面向连接,可靠,慢,对传递的数据的长短没有要求

    面向连接

    两台机器之间要想传递信息,必须先建立连接

    之后在有了连接的基础上,进行信息的传递

    可靠

    数据不会丢失,不会重复被接收

    三次握手,四次挥手

    这种可以互相发送信息的连接方式叫做全双工的通信方式

    三次握手:为了开始连接 三次握手分别是

    客户端发送信息请求连接

    服务端回复信息表示收到,再发送信息请求连接

    客户端回复信息表示收到

    四次挥手:为了结束连接 四次挥手分别是

    客户端发送信息请求断开连接

    服务端回复信息表示收到

    服务端发送信息请求断开连接        (不跟上一条合并成一条的原因是客户端断开连接是因为想要传递的数据已经传递完了 而服务端给客户端传递数据可能没传递完)

    客户端回复信息表示收到

    因为每一次发送的数据还要等待结果

    TCP协议实现的多人聊天

    import socket
    sk = socket.socket()
    sk.bind(('127.0.0.1',9056))
    sk.listen()
    while 1:
        conn,addr = sk.accept()
        while 1:
            n = input('>>>')
            if n.upper() == 'Q':
                break
            conn.send(n.encode('utf-8'))
            msg = conn.recv(1024)
            if msg.upper() == 'Q': break
            print(msg.decode('utf-8'))
        conn.close()
    sk.close()
    server端
    import socket
    sk = socket.socket()
    sk.connect(('127.0.0.1',9056))
    while 1:
        msg = sk.recv(1024).decode('utf-8')
        if msg.upper() == 'Q':
            break
        print(msg)
        n = input('>>>')
        sk.send(n.encode('utf-8'))
        if n.upper() == 'Q': break
    sk.close()
    client端

    socket server(多线程并行)

    import socketserver
    
    class MyServer(socketserver.BaseRequestHandler): # 继承的类固定的
    
        def handle(self):  # 必须是这个handle名字.
            while 1:
                from_client_data = self.request.recv(1024).decode('utf-8')  
                print(from_client_data)
                to_client_data = input('>>>').strip()
                self.request.send(to_client_data.encode('utf-8'))
    
    if __name__ == '__main__':
        ip_port = ('127.0.0.1',8848)
        server = socketserver.ThreadingTCPServer(ip_port,MyServer)
        server.serve_forever()
    server端
    import socket
    
    phone = socket.socket() # 可以默认不写
    phone.connect(('127.0.0.1', 8848))
    
    while 1:
        content = input('>>>').strip()
        phone.send(f'对象人名:{content}'.encode('utf-8'))
        from_server_data = phone.recv(1024)
        print(f'来自服务端消息:{from_server_data.decode("utf-8")}')
    
    phone.close()
    client端

    UDP协议

    无连接,不可靠,快,不能传输过长的数据

    无连接

    机器之间传递信息不需要建立连接,直接发就行了

    不可靠

    数据有可能丢失

    UDP协议实现的多人聊天

    import socket
    sk = socket.socket(type=socket.SOCK_DGRAM)
    sk.bind(('127.0.0.1',9555))
    while 1:
        msg,addr = sk.recvfrom(1024)
        print(msg.decode('utf-8'))
        con = input('>>>')
        sk.sendto(con.encode('utf-8'),addr)
    sk.close()
    server端
    import socket
    sk = socket.socket(type=socket.SOCK_DGRAM)
    addr = ('127.0.0.1',9555)
    while 1:
        con = input('>>>')
        if con.upper() == 'Q': break
        sk.sendto(con.encode('utf-8'),addr)
        msg = sk.recv(1024).decode('utf-8')
        if msg.upper() == 'Q': break
        print(msg)
    sk.close()
    client端

    即使通讯类的软件: QQ , 微信 , YY  视频在线观看 大部分是基于UDP协议

    发文件,邮件的时候   视频缓存观看  大部分是基于TCP协议

    osi七层协议

    应用层  

            表示层 合并到应用层

            会话层 合并到应用层

    http协议

    代表用户层    python

    send ('hello world')

    socket

    传输层

    所有和端口有关的信息  TCP/UDP协议

    对应的物理设备:四层路由器,四层交换机(除了本来的IP和mac地址信息,还可以理解端口信息和TCP/UDP协议)

    网络层

    和IP地址相关的内容

    IP协议

    对应的物理设备:路由器,三层交换机(这个交换机能够在三层工作,具有路由器的功能)

    数据链路层

    和mac地址相关的事情

    arp协议

    对应的物理设备:网卡,交换机,二层交换机(普通的交换机)

    物理层

    把所有的东西转成10101010

    对应的物理设备:网线

    发送信息时是从上到下拼接

    发送给另外一台机器

    另外一台机器也具备这些协议

    但从下往上走

    先看mac地址

    再看IP地址

    确定了就是我要找的机器

    越接近确认是不是我的机器的内容 越往下走

    越接近是不是这个服务 应用 发送什么内容  越往上走

    是一个U形的过程

  • 相关阅读:
    焦点事件中的Validating处理方法
    推荐一个快速反射调用的类
    VB.NET自我总结语法
    WinForm应用程序实现虚拟键盘
    将图片保存到XML文件的方法
    分享TextBoxLineEx控件
    自定义CancelEventArgs类,封装事件参数信息,实现e.Cancle=true取消机制。
    从sql server 中读取二进制图片
    Oracle数据库自我总结
    Android DroidDraw UI设计工具下载地址
  • 原文地址:https://www.cnblogs.com/biulo/p/10679841.html
Copyright © 2011-2022 走看看