tcp / udp 协议及其实现的socket
一、tcp协议
1.1 基本知识
- 特点:
- 可靠,慢,全双工通信
- 建立连接时:三次握手
- 断开连接时:四次挥手
- 在建立起连接之后
- 发送的每一条信息都有回执
- 为了保证数据的完整性,还有重传机制
- 长连接:会一直占用双方的端口
- IO(input,output)操作,输入和输出是相对内存来说的
- write send - output
- read recv - input
- 能够传递的数据长度几乎没有限制
- 应用场景:
- 文件的上传下载
- 发送邮件,网盘,缓存电影等
- 文件的上传下载
- 简述三次握手和四次挥手
- 三次握手
- accept接受过程中等待客户端的连接
- connect客户端发起一个syn链接请求
- 如果得到了server端响应ack的同时还会再收到一个由server端发来的syc链接请求
- client端进行回复ack之后,就建立起了一个tcp协议的链接
- 三次握手的过程再代码中是由accept和connect共同完成的,具体的细节再socket中没有体现出来
- 四次挥手
- server和client端对应的在代码中都有close方法
- 每一端发起的close操作都是一次fin的断开请求,得到'断开确认ack'之后,就可以结束一端的数据发送
- 如果两端都发起close,那么就是两次请求和两次回复,一共是四次操作
- 可以结束两端的数据发送,表示链接断开了
- 三次握手
1.2 tcp协议的粘包现象
- 什么是粘包现象?
- 发生在发送端的粘包
- 由于两个数据的发送时间间隔短+数据的长度小
- 所以由tcp协议的优化机制将两条信息作为一条信息发送出去了
- 为了减少tcp协议中的“确认收到”的网络延迟时间
- 发生再接收端的粘包
- 由于tcp协议中所传输的数据无边界,所以来不及接收的多条
- 数据会在接收放的内核的缓存端黏在一起
- 本质: 接收信息的边界不清晰
- 发生在发送端的粘包
- 解决粘包问题
- 自定义协议1
- 首先发送报头,报头长度4个字节,内容是即将发送的报文的字节长度
- struct模块 pack 能够把所有的数字都固定的转换成4字节
- 再发送报文
- 首先发送报头,报头长度4个字节,内容是即将发送的报文的字节长度
- 自定义协议2
- 我们专门用来做文件发送的协议
- 先发送报头字典的字节长度,再发送字典(字典中包含文件的名字、大小),再发送文件的内容
- 自定义协议1
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 基本知识
- 特点:
- 无连接的,速度快
- 可能会丢消息
- 能够传递的数据长度是有限的,是根据数据传递设备的设置有关系
- 应用场景:
- 即时通信类
- qq,微信,飞秋等
- 即时通信类
- tcp协议和udp协议的区别
- tcp协议:是一个面向连接的,流式的,可靠的,慢的,全双工通信
- 邮件 文件 http web
- udp协议:是一个面向数据报的,无连接的,不可靠,快的,能完成一对一、一对多、多对一、多对多的高效通讯协议
- 即时聊天工具 视频的在线观看
- tcp协议:是一个面向连接的,流式的,可靠的,慢的,全双工通信
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的更多相关文章
- 网络编程—网络基础概览、socket,TCP/UDP协议
网络基础概览 socket概览 socket模块—TCP/UDP的实现 TCP/UDP总结 网络基础概览 osi七层协议各层主要的协议 # 物理层传输电信号1010101010 # 数据链路层,以太网 ...
- QQ--基于TCP/UDP协议的通讯原理
QQ是一个基于TCP/UDP协议的通讯软件 发送消息的时候是UDP打洞,登陆的时候使用HTTP~因为登陆服务器其实就是一个HTTP服 务器,只不过不是常用的那些,那个服务器是腾讯自行开发的! 一 ...
- java 通过TCP\UDP 协议实现多人聊天,点对点,文件传送-----分服务器端和客户端
java 通过TCP\UDP 协议实现多人聊天,点对点,文件传送-----分服务器端和客户端 启动界面如下图: 首先启动服务器: 客户端登陆,登陆成功后为: 默认发送是全部用户,是多人发送. 当在边列 ...
- 聊聊iOS中TCP / UDP 协议
TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于 传输层协议. UDP(User Datagram protoco ...
- TCP/UDP协议(二)
面试问题:Tcp/Udp协议是什么,各有什么异同点,各自的使用场景? Tcp协议(传输控制协议) tcp是面向连接的协议,在收发数据之前,必须与对方建立可靠的连接: 三次握手:简单形象通俗描述: 主机 ...
- TODO:Golang语言TCP/UDP协议重用地址端口
TODO:Golang语言TCP/UDP协议重用地址端口 这是一个简单的包来解决重用地址的问题. go net包(据我所知)不允许设置套接字选项. 这在尝试进行TCP NAT时尤其成问题,其需要在同一 ...
- TCP/UDP协议简要梳理
TCP/UDP协议简要梳理 TCP TCP,Transmission Control Protocol,传输控制协议是一种面向连接的.可靠的.基于字节流的传输层通信协议.在因特网协议族中,TCP所在的 ...
- Shell 脚本实现TCP/UDP协议通讯
Shell 脚本实现TCP/UDP协议通讯 http://www.cnblogs.com/occult/archive/2012/12/25/2832183.html
- python socket原理 及socket如何使(tcp udp协议)
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API) 主要内容: 1.基于 ...
随机推荐
- Go语言goroutine调度器初始化(12)
本文是<Go语言调度器源代码情景分析>系列的第12篇,也是第二章的第2小节. 本章将以下面这个简单的Hello World程序为例,通过跟踪其从启动到退出这一完整的运行流程来分析Go语言调 ...
- docker 部署appium
1.docker appium镜像和命令:https://github.com/appium/appium-docker-android 2.启动appium docker run --privile ...
- 论文阅读笔记六十:Squeeze-and-Excitation Networks(SENet CVPR2017)
论文原址:https://arxiv.org/abs/1709.01507 github:https://github.com/hujie-frank/SENet 摘要 卷积网络的关键构件是卷积操作, ...
- CF1175F The Number of Subpermutations
题目链接 题意 给出一个长度为\(n\)的序列\(a\),问有多少个区间\([l,r]\)满足:在区间\([l,r]\)内,\([1,r-l+1]\)的每个整数都恰好出现了一次. \(n \le 3 ...
- VSCode编写C/C++语言,配置文件和注意事项
前言 主要是自己先下载好VSCode,然后在自己电脑上安装好就行了,但是VSCode是编辑器,不是IDE,所以需要自己配置文件,主要有四个都是以.json结尾的文件,这里默认已经装过C/C++的编辑器 ...
- [LeetCode] 393. UTF-8 Validation 编码验证
A character in UTF8 can be from 1 to 4 bytes long, subjected to the following rules: For 1-byte char ...
- 后端设置Cookie前端跨域获取丢失问题(基于springboot实现)
1.跨域问题说明:后端域名为A.abc.com,前端域名为B.abc.com. 2.后端设置一个cookie发送给前台,domain应该是setDomain(“abc.com”),而不是setDoma ...
- Linux系统运维笔记,CentOS 7.4防火墙配置
1.查看firewall服务状态 systemctl status firewalld 2.查看firewall的状态 firewall-cmd --state 3.开启.重启.关闭.firewall ...
- oracle--查询速度慢
查询速度慢的原因很多,常见如下几种: 1, 没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2, I/O吞吐量小,形成了瓶颈效应. 3, 没有创建计算列导致查询不优化. 4, ...
- 第四次实验报告:使用Packet Tracer理解RIP路由协议
目录 1 实验目的 2 实验内容 3. 实验报告 3.1 建立网络拓扑结构 3.2 配置参数 3.3 测试网络连通性 3.4 理解RIP路由表建立和更新 4. 理解RIP消息传得慢 5. 拓展 1 实 ...