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()

原文地址:https://www.cnblogs.com/zengyi1995/p/10948731.html

时间: 2024-10-01 00:29:06

tcp / udp 协议及其实现的socket的相关文章

网络编程—网络基础概览、socket,TCP/UDP协议

网络基础概览 socket概览 socket模块-TCP/UDP的实现 TCP/UDP总结 网络基础概览 osi七层协议各层主要的协议 # 物理层传输电信号1010101010 # 数据链路层,以太网协议,arp协议.对这些信号进行分组,同时规范了分组形式--以太网协议,头部是mac地址中间是信息, # 网络层:ip协议,arp协议帮忙找到mac地址,ip,子网掩码,网关(下面有一些简单概括) # 传输层:tcp协议,udp协议 # (socket)就是一组接口,将复杂的tcp协议和udp协议隐

java 通过TCP\UDP 协议实现多人聊天,点对点,文件传送-----分服务器端和客户端

java 通过TCP\UDP 协议实现多人聊天,点对点,文件传送-----分服务器端和客户端 启动界面如下图: 首先启动服务器: 客户端登陆,登陆成功后为: 默认发送是全部用户,是多人发送. 当在边列表里面选择了用户后,可以与此用户建立点对点链接进行聊天,可以发送文件. 用户在线离线状态会实时更新,如果离线,则存为离线消息.当下次上线的时候,会接受到离线消息 从一个用户接受文件的同时,还可以接受从服务器发过来的文件 接受文件完成后,显示记录,并显示保存目录 消息发送演示 服务器端代码: 1 im

2020-03-21 TCP/UDP协议

一.tcp协议 如果在面试的过程中,要讲这个,可以拿打电话这个场景来说明. 二.UDP协议 用处:视频.直播.日志上报. 三.TCP/UDP的比较 四.Socket 原文地址:https://www.cnblogs.com/mathlin/p/12539800.html

TCP/UDP协议

TCP/UDP协议 1.协议简介 TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于传输层协议.其中TCP提供IP环境下的数据可靠传输,它提供的服务包括数据流传送.可靠性.有效流控.全双工操作和多路复用.通过面向连接.端到端和可靠的数据包发送.通俗说,它是事先为所发送的数据开辟出连接好的通道,然后再进行数据发送:而UDP则不为IP提供可靠性.流控或差错恢复功能.一般来说,TCP对应的是可靠性要求高的应用,而UDP

Shell 脚本实现TCP/UDP协议通讯

Shell 脚本实现TCP/UDP协议通讯 http://www.cnblogs.com/occult/archive/2012/12/25/2832183.html

TCP/UDP协议简要梳理

TCP/UDP协议简要梳理 TCP TCP,Transmission Control Protocol,传输控制协议是一种面向连接的.可靠的.基于字节流的传输层通信协议.在因特网协议族中,TCP所在的层位于IP层之上,应用层之下. TCP面向连接.其实网络上的传输是没有连接的,包括TCP也是如此.而TCP所谓的"连接",其实只不过是在通讯的双方维护一个"连接状态",从而从应用层看,它们是连接在一起的.所以,TCP的状态变换非常重要.尤其在进行数据传递前的三次握手和数

第29篇ip地址,mac地址 IPV4 IPV6 TCP UDP协议

回顾 2018-12-31 或者 2018.12.31 或者 2018*12*31 的正则表达式: [1-9]\d{3}(?P<sep>.)(1[12]|0?[1-9])(?P=sep)([12]\d|3[01]|0?[1-9])内容总览: ip地址 mac地址 IPV4 IPV6 TCP UDP协议 同一台机器的两个程序通讯-->文件 两台机器的两个程序之间通讯 -->网络 mac 每一台计算机的网卡 上面会有一个mac地址,也就是相当于改计算机在网络上的唯一身份表示 xx-xx

TCP/UDP协议、理解三次握手四次挥手、Socket

一.什么是socket? 中文名叫套接字,是对底层的 TCP IP UDP 等网络协议进行封装,使得上层的应用程序开发者,不用直接接触这对复杂,丑陋的协议. 在程序员的言论,他就是一个封装好的模块,要完成网络通讯,只需要使用系统提供的socket模块就行,我们通过调用模块中已经实现的方法建立两个进程之间的 连接和通信. 了解socket层: 二.套接字的发展史 套接字起源于 20 世纪 70 年代加利福尼亚大学伯克利分校版本的 Unix,即人们所说的 BSD Unix. 因此,有时人们也把套接字

TCP/IP模型及TCP/UDP协议

协议:为进行网络中的数据交换(通信)而建立的规则.标准或约定.(=语义+语法+规则) TCP/IP已成为Internet上通信的工业标准. TCP/IP模型: TCP协议是一个面向连接的可靠性传输协议,在发送数据之前,先要发出连接请求,当对方监听到有请求来到时就建立连接,然后双方就可以收发消息,发送完信息后,双方就断开连接(即三次握手协议). 三次握手协议: 第一次握手: 建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认:SYN:同步序列编号(Sy