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

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

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

    网络基础概览 socket概览 socket模块—TCP/UDP的实现 TCP/UDP总结 网络基础概览 osi七层协议各层主要的协议 # 物理层传输电信号1010101010 # 数据链路层,以太网 ...

  2. QQ--基于TCP/UDP协议的通讯原理

    QQ是一个基于TCP/UDP协议的通讯软件  发送消息的时候是UDP打洞,登陆的时候使用HTTP~因为登陆服务器其实就是一个HTTP服 务器,只不过不是常用的那些,那个服务器是腾讯自行开发的!   一 ...

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

    java 通过TCP\UDP 协议实现多人聊天,点对点,文件传送-----分服务器端和客户端 启动界面如下图: 首先启动服务器: 客户端登陆,登陆成功后为: 默认发送是全部用户,是多人发送. 当在边列 ...

  4. 聊聊iOS中TCP / UDP 协议

    TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于 传输层协议. UDP(User Datagram protoco ...

  5. TCP/UDP协议(二)

    面试问题:Tcp/Udp协议是什么,各有什么异同点,各自的使用场景? Tcp协议(传输控制协议) tcp是面向连接的协议,在收发数据之前,必须与对方建立可靠的连接: 三次握手:简单形象通俗描述: 主机 ...

  6. TODO:Golang语言TCP/UDP协议重用地址端口

    TODO:Golang语言TCP/UDP协议重用地址端口 这是一个简单的包来解决重用地址的问题. go net包(据我所知)不允许设置套接字选项. 这在尝试进行TCP NAT时尤其成问题,其需要在同一 ...

  7. TCP/UDP协议简要梳理

    TCP/UDP协议简要梳理 TCP TCP,Transmission Control Protocol,传输控制协议是一种面向连接的.可靠的.基于字节流的传输层通信协议.在因特网协议族中,TCP所在的 ...

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

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

  9. python socket原理 及socket如何使(tcp udp协议)

    网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API) 主要内容: 1.基于 ...

随机推荐

  1. MyBatis学习笔记-1 Idea配置MyBatis

    一.创建工程 1.创建Java项目,勾选Java EE,Next,修改名称,Finish 2.在WEB-INF下创建两个文件夹classes和lib,分别用作输出文件目录和库文件目录 3.File-P ...

  2. 201871010107-公海瑜《面向对象程序设计(java)》第十六周学习总结

    201871010107-公海瑜<面向对象程序设计(java)>第十六周学习总结            项目                            内容   这个作业属于哪 ...

  3. TCP的三次握手和四次挥手详解

    相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不需要控制这个过程.但是对于理解TCP底层运作机制,相当有帮助. TCP报文格式 TCP的包如下: ...

  4. 使用jdk 容器镜像注意默认编码问题

    最近在使用一个开源数据pipeline 处理的工具的时候,发现了jdk容器镜像编码的一些问题 以下是一个简单的描述 问题 使用了streamsets 工具,使用容器运行,默认使用了adoptopenj ...

  5. 记一次排错经历,requests和fake_useragent

    在部署tornado项目上线时, 首次重启服务后第一次请求必然会报错, 后续的就能正常访问, 长报错urllib.error.URLError,如图排查多次依然发现不了问题 报的最多的依然是上图中的错 ...

  6. mission3--dp

    A---母牛的故事 题目大意:第一年有一头母牛,每年年初母牛生小母牛,小母牛第四个年头可以开始生小牛. 问第n年有多少头牛. 题解: (1)列出前几项来找规律(2)第i年牛的数量=第i-1年牛的数量+ ...

  7. luoguP4213 【模板】杜教筛(Sum)杜教筛

    链接 luogu 思路 为了做hdu来学杜教筛. 杜教筛模板题. 卡常数,我加了register居然跑到不到800ms. 太深了. 代码 // luogu-judger-enable-o2 #incl ...

  8. [LeetCode] 12. Integer to Roman 整数转化成罗马数字

    Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M. Symbol Value I 1 ...

  9. Oracle--RMAN Recover 缺失的归档操作

    一,环境简介 Oracle RMAN 备份的恢复分2个步骤:RESTRE 和 RECOVER.在这里回复的时候是依赖者归档文件的,当周一完成数据全备,保留归档的情况下,后期数据有问题,恢复的时候发现少 ...

  10. No package python-pip available. 解决方法

    问题描述: No package python-pip available. 解决办法: rpm -ivh http://dl.fedoraproject.org/pub/epel/6/i386/ep ...