zoukankan      html  css  js  c++  java
  • tcp / udp 协议及其实现的socket

    一、tcp协议

    1.1 基本知识

    1. 特点:
      • 可靠,慢,全双工通信
      • 建立连接时:三次握手
      • 断开连接时:四次挥手
      • 在建立起连接之后
        • 发送的每一条信息都有回执
        • 为了保证数据的完整性,还有重传机制
      • 长连接:会一直占用双方的端口
      • IO(input,output)操作,输入和输出是相对内存来说的
        • write send - output
        • read recv - input
      • 能够传递的数据长度几乎没有限制
    2. 应用场景:
      • 文件的上传下载
        • 发送邮件,网盘,缓存电影等
    3. 简述三次握手和四次挥手
      • 三次握手
        • accept接受过程中等待客户端的连接
        • connect客户端发起一个syn链接请求
          • 如果得到了server端响应ack的同时还会再收到一个由server端发来的syc链接请求
          • client端进行回复ack之后,就建立起了一个tcp协议的链接
        • 三次握手的过程再代码中是由accept和connect共同完成的,具体的细节再socket中没有体现出来
      • 四次挥手
        • server和client端对应的在代码中都有close方法
        • 每一端发起的close操作都是一次fin的断开请求,得到'断开确认ack'之后,就可以结束一端的数据发送
        • 如果两端都发起close,那么就是两次请求和两次回复,一共是四次操作
        • 可以结束两端的数据发送,表示链接断开了

    1.2 tcp协议的粘包现象

    1. 什么是粘包现象?
      • 发生在发送端的粘包
        • 由于两个数据的发送时间间隔短+数据的长度小
        • 所以由tcp协议的优化机制将两条信息作为一条信息发送出去了
        • 为了减少tcp协议中的“确认收到”的网络延迟时间
      • 发生再接收端的粘包
        • 由于tcp协议中所传输的数据无边界,所以来不及接收的多条
        • 数据会在接收放的内核的缓存端黏在一起
      • 本质: 接收信息的边界不清晰
    2. 解决粘包问题
      • 自定义协议1
        • 首先发送报头,报头长度4个字节,内容是即将发送的报文的字节长度
          • struct模块 pack 能够把所有的数字都固定的转换成4字节
        • 再发送报文
      • 自定义协议2
        • 我们专门用来做文件发送的协议
        • 先发送报头字典的字节长度,再发送字典(字典中包含文件的名字、大小),再发送文件的内容

    1.3 基于tcp协议的socket

    • tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端

      # server.py 服务端
      import socket
      sk = socket.socket()
      sk.bind(('127.0.0.1',8898)) 
      sk.listen()                 
      conn,addr = sk.accept()     
      ret = conn.recv(1024)       
      print(ret)                  
      conn.send(b'hi')            
      conn.close()                
      sk.close()                  
      
      # client.py 客户端
      import socket
      sk = socket.socket()             
      sk.connect(('127.0.0.1',8898))   
      sk.send(b'hello!')
      ret = sk.recv(1024)               
      print(ret)
      sk.close()                       
      
      # 注意:运行时,先执行server.py,再执行client.py
      

    二、udp协议

    2.1 基本知识

    1. 特点:
      • 无连接的,速度快
      • 可能会丢消息
      • 能够传递的数据长度是有限的,是根据数据传递设备的设置有关系
    2. 应用场景:
      • 即时通信类
        • qq,微信,飞秋等
    3. tcp协议和udp协议的区别
      • tcp协议:是一个面向连接的,流式的,可靠的,慢的,全双工通信
        • 邮件 文件 http web
      • udp协议:是一个面向数据报的,无连接的,不可靠,快的,能完成一对一、一对多、多对一、多对多的高效通讯协议
        • 即时聊天工具 视频的在线观看

    2.2 基于udp协议的socket

    • udp是无链接的,启动服务之后可以直接接受消息,不需要提前建立链接

      # server.py 服务端
      import socket
      sk = socket.socket(type=socket.SOCK_DGRAM)   
      sk.bind(('127.0.0.1',9000))                  
      msg,addr = sk.recvfrom(1024)
      print(msg)
      sk.sendto(b'hi',addr)                        
      sk.close()                                  
      
      # client.py 客户端
      import socket
      sk = socket.socket(type=socket.SOCK_DGRAM)
      sk.sendto(b'hello',('127.0.0.1',9000))
      msg = sk.recv(1024)
      print(msg.decode('utf-8'))
      sk.close()
      
  • 相关阅读:
    C++ STL中vector应用
    cocos2dx绘制直线
    [ios] 获得ios设备具体型号
    如何制作 iTunesArtwork
    Ios AppIcon 去掉默认半弧形白色遮罩
    App运行内存打印
    C++ 文件操作
    objc 笔记
    (转)c++ oc字符操作
    cocos2dx 文本 优化
  • 原文地址:https://www.cnblogs.com/zengyi1995/p/10948731.html
Copyright © 2011-2022 走看看