UDP与TCP

1.网络的目的 信息交流和数据的传递 2.IP地址的作用 用来标识网络中的一台主机/计算机 Ip地址由 网络号和主机号构成 bit位 只能是 0或者1 1bytes=8bit #1个字节8个比特位 IPV4 用4个字节描述的ip地址 # 192.168.27.255 IPV6 用8个字节描述的ip地址 #7e44:7755:7e41:9122 Ifconfig 显示所有网卡的信息 Ifconfig设置ip地址等信息会在重启后消失,一般情况下自动获取ip即可不需要手动设置ip Ping 测试远程主机连接性 # ping 域名/ip地址 DNS域名解析服务器 Ping通 网络是一定通畅的 Ping不通 不一定不通 3.端口标识着主机中的一个应用程序 #pot 常用的知名端口 22 #ssh服务
80 # http服务 443 # https服务器 #一般情况下程序需要使用知名端口需要有root权限
动态端口 范围 1024-65535 Socket 简称套接字 最通用的进程间通信的一种方式 可以实现不同主机间的通信 4.bytes类型 二进制 字节类型(音频 图片 等二进制数据) Str类型 字符串类型 Str ---编码 s.encode(“utf-8”)--->bytes Bytes <----解码b.decode(“uutf-8”)--- -str
UTF编码的汉字 1个汉字3个字节 GBK编码的汉字 1个汉字2个字节
Sendto() 发送数据 Recvfrom函数功能 接收UDP数据 Recvfrom() #参数是本次接收的最大长度 1024的整数倍 返回值
创建套接字 在 Python 中 使用socket 模块的函数 socket 就可以完成: import socket socket.socket(AddressFamily, Type) 函数 socket.socket 创建一个 socket,该函数带有两个参数: Address Family:可以选择 AF_INET(用于 Internet 进程间通信 表示IPv4协议) 或者 AF_INET6(表示IPv6协议 未来 很快可能用上) 等 Type:套接字类型,可以是 SOCK_DGRAM(数据报套接字,主要用于 UDP 协议)或者 SOCK_STREAM(流式套 接字,主要用于 TCP 协议)等 调用套接字 Import socket Udp_socket=socket.socket(socket.AD_INET,socket.SOCK_DGRAM 关闭套接字 Udp_socket.close Udp发送数据 Udp_socket.sendto(bytes类型数据,收件人套接字地址) Udp套接字接收数据 - 阻塞接收数据 Bytes类型数据,发件人套接字地址 = udp_socket.recvfrom(接收最大长度) 使用固定端口-bind Udp_socket.bind(本地套接字地址)

TCP TCP协议 传输控制协议 面向连接的 可靠的 基于字节流的传输层通信协议 TCP通信需要 创建连接 数据传送 终止连接(UDP不需要创建连接) TCP特点: 1.面向连接 2.可靠性 #应答机制 超时重传 数据收发不丢包 给每个包一个序号 3.错误校验 #发送和接收时都会计算校验 4.流量控制 # 调整流量传送大小 -减少超时重传的几率 Socket.SOCK_STREAM 流stream式报文协议
TCP客户端流程: 1.找到电话 2.拨打电话 3.交流数据 4.关掉电话 Connect函数 创建和服务器之间的连接 参数 服务器套接字(IP,port) recv 函数 接收TCP数据 参数 表示本次接收的最大长度 返回值 接收到的数据是bytes类型 Send 函数 发送TCP数据 参数 表示发送的数据bytes类型 返回值 成功发送的字节数 TCP服务器流程: Listen() 变为被动套接字 接受来自客户端的连接 客户端关联的套接字 = accept()阻塞等待 从等待服务器取出一个客户服务
Connect函数 发起和服务器的三次握手过程 (全连接) # 只有1个SYN-半连接 SYN 同步--建立连接请求 ACK 应答 Listen参数设置等待服务区的大小---- Linux 已完成队列长度 单工-只有一个功能 半双工-同时只能用一个功能 全双工-同时执行两个功能 Accept从已完成三次握手队列中取一个客户端关联的套接字
断链接四次挥手 主动端 被动端 FIN-FINISH 完成 断开连接请求 ACK 2MSL状态 TCP规定 主动断开连接的一方 需要等待30s-2min 以确认最后一次 ACK一定被对方接受到 ---->导致 TCP连接使用的端口 在30s-2min内 不能再次绑定 解决方案: set socket option 设置套接字选项 Sock.setsocket() Address in use问题 1.pychram同时启动了多个程序绑定同一个端口 2.Pychram后台进程还在继续占用之前的端口 3.TCP 2MSL时间 #设置套接字选项 对套接字级别的选项进行设置 重用地址 Sever_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # 1设置 0取消

TCP/IP 简介(族): Tcp,udp 都处于传输层
常用的网络协议过程: #TCP/IP四层参考模型 应用层-->传输层-->网际层-->网络接口层 分层的意义: 1.封装 2.隔离 多任务-线程: 单核CPU执行多个程序 给每个程序分配一点执行时间 ---------------------时间片 基于时间片的轮转--并发 双核 多个CPU 并行--同一时间点执行多个多个任务 线程: 线程就是进程内部的一条执行线索
在主线程上新创建的叫子线程
使用多线程模块 # threading 多线程执行时候没有顺序
Thread 参数 target参数指定 子线程运行函数
args指定子线程函数运行时所需的参数
阻塞等待子线程运行完成 Thd.join()
将Thread对象和线程需要执行的代码 封装在一个类中 Run 方法 1.多任务的两种方式: 现代操作以线程作为执行单元 并行: 同一时间点运行多个任务 并发:同一时间段运行多个任务 2.创建子线程 创建Thread类的对象 Imoport threading Thd = threading.Thread(target=子线程运行的函数名,args=(位置参数),kwargs={参数名:值} 启动子线程创建和运行 Thd.start() 阻塞等待子线程运行完成 Thd.join()
3.同步 保持一定秩序 互斥锁是一种同步手段 互斥锁特点: 保证同一时间点,只有一个线程能够获取到 锁资源 锁的好处: 确保了某段关键代码只能由一个线程从头到尾完整的执行 锁的坏处: 阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率降低 由于可以存在多个锁,不同的线程持有不同的锁,并试图获取对方持有的锁时,可能造成死锁

猜你喜欢

转载自blog.csdn.net/dawukongdada/article/details/80053972