1.传输层之TCP与UDP协议

1.TCP协议

1.传输控制协议(也称为TCP协议或可靠协议)是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议,(数据不容易丢失);造成数据不容易丢失的原因不是因为有双向通道,而是因为有反馈机制,类似工作机制如下:给对方发送消息之后会保留一个副本,知道你对方回应消息已收到时才会删除,否则会在一定时间内反复发送。

2.洪水攻击:同一时间有大量客户端请求建立连接,会导致服务端一直处于SYN_RCVD状态,如果遇到洪水攻击就应建立缓冲池,类似'排队'。

3.服务端如何区分客户端建立连接的请求:可以对请求做唯一标识

4.三次握手建立连接:
4.1 当应用程序希望通过TCP与另一个应用程序通信时,它会发送一个通信请求,询问能否与服务端进行连接,这个数据包称为SYN包。 4.2 如果服务端同意则回复一个SYN+ACK包 4.3 客户端收到之后回复一个ACK包,建立连接
"""
三次握手的原因在于:假设采取两次握手建立连接,因为某些错误客户端的SYN1包没有到达服务器,在中间表某个节点产生滞留,此时客户端会重新发送SYN包,这次数据正常送达,服务端回复SYN+ACK之间建立连接,但是突然第一包的数据网络阶段突然恢复,SYN1此时送达服务端,这是服务端会认为是客户端重新发起一次连接。如果三次握手之后服务端收不到最后的ASK包,自然不会建立连接
"""

5.四次挥手断连接:
5.1 当客户端没有消息要发给服务端,由客户端首先发送syn消息请求断开通道。 5.2 服务端客户端回复ACK包,无条件同意断开请求。 5.3 服务端此时还可以发送未发送数据,而客户端还可以接受数据,待服务端发送完数据后,向客户端发送syn包,进入最后确认状态。 5.4 客户端收到之后回复ACK包,此时连接关闭。 """
TCP类似于打电话,UCP类似于发短信
"""

2.UPD协议

1.也称为数据报协议、不可靠协议,早期的QQ使用的是纯生的(不加任何额外功能)UDP协议。使用UDP的原因就是因为很简单、快捷、粗暴、只要指定对方的地址就可以发消息了。
"""
TCP我们可以看成是打电话:双方有来有回
UDP我们可以看成是发短信:只要发了就行,不管对方看不看
"""

2.应用层

应用层相当于是程序员自己写的应用程序 里面的协议非常的多
常见的有:HTTP、HTTPS、FTP

3.socket模块(基于TCP协议)

1.socket介绍

如果我们需要编写基于网络进行数据交互的程序,意味着我们需要自己通过代码来控制我们之前所学习的OSI七层(很繁琐,很复杂,类似于我们自己编写操作系统)。socket类似于操作系统,封装了丑陋复杂的接口提供简单快捷的接口。
Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。 socket也叫套接字
基于文件类型的套接字家族(单机):AF_UNIX
基于网络类型的套接字家族(联网:AF_INET

2.代码步骤

'''TCP是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端'''
server(服务)端:
import socket
1.创建套接字:sever = socket.socket() 2.绑定地址:sever.bind(('127.0.0.1', 8870))
''' "127.0.0.1"是回送地址,指本地机,一般用来测试,当客户端和服务端在一台电脑上时使用''' 3.侦听客户请求:sever.listen() 4.接收客户连接:sock,addr = sever.accept() 5.接收客户信息:data = sock.recv(1024) print(data.decode('utf8')) 6.向客户发送信息:sock.send(msg.encode('utf8')) # 需要转成二进制发送 7.关闭客户端套接字:sock.close() client(客户)端:
import socket
1.创建套接字:client = socket.socket() 2.尝试链接服务器:client.connect(('127.0.0.1', 8870)) 3.发送请求:client.send(发送的内容(字符串类型).encode('utf8')) 4.接受信息:data = client.recv(1024) print(data.decode('utf8')) 5.关闭套接字:client.close()

3.代码优化

1.聊天内容自定义:针对消息采用input获取

2.让聊天循环起来:用while加上循环

3.用户输入的消息不能为空:本质其实是两边不能都是recv或者send 一定是一方收一方发 

4.服务端多次重启可能会报错,Address already in use(主要是mac电脑会报)
修改方法:
1.改端口号
2.拷贝以下代码:
from socket import SOL_SOCKET,SO_REUSEADDR # 放在import socket下面
sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) # 在bind前加 5.当客户端异常断开的情况下,如何让服务端继续服务其他客人:
windows服务器会直接报错
mac服务端会有一段时间反复接收空消息延迟报错 优化后的代码(服务端未设置空白消息检测):
服务端:
import socket
from socket import SOL_SOCKET, SO_REUSEADDR server = socket.socket()
server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
server.bind(('127.0.0.1', 8081))
server.listen(5) while True: # 链接循环
sock, addr = server.accept()
while True: # 通信循环
try:
data = sock.recv(1024)
if len(data) == 0:
break
print(f'来自于客户端{addr}的消息>>>:', data.decode('utf8'))
msg = input('请输入发送给客户端的消息(不能发空消息)>>>:').strip()
sock.send(msg.encode('utf8'))
except BaseException:
break 客户端:
import socket client = socket.socket()
client.connect(('127.0.0.1', 8081))
while True:
msg = input('请输入您想要发送给服务端的消息>>>:').strip()
if len(msg) == 0:
print('不能发送空消息')
continue
client.send(msg.encode('utf8'))
data = client.recv(1024)
print('来自于服务端发送过来的消息>>>:', data.decode('utf8')) 服务端设置成可以检测空白消息:
服务端:
import socket server = socket.socket()
server.bind(('127.0.0.1', 8082))
server.listen(5)
while True:
sock, addr = server.accept()
while True:
try:
data = sock.recv(1024)
print(f'来自客户端{addr}的消息>>>:',data.decode('utf8'))
while True:
msg = input('>>>:').strip()
if len(msg) == 0:
print('不能发送空白消息')
continue
break
sock.send(msg.encode('utf8'))
except Exception:
break 客户端:
import socket client = socket.socket()
client.connect(('127.0.0.1', 8082))
while True:
msg = input('>>>:').strip()
if len(msg) == 0:
print('不能发送空白消息')
continue
client.send(msg.encode('utf8'))
data = client.recv(1024)
print('来自服务端的消息>>>:', data.decode('utf8'))

4.半连接池的概念

server.listen(5)  # 半连接池

当有多个客户端来链接的情况下 我们可以设置等待数量(不考虑并发问题)
假设服务端只有一个人的情况下 在测试半连接池的时候 可以不用input获取消息 直接把消息写死即可

TCP与UDP、socket模块的更多相关文章

  1. HTTP/TCP/IP UDP Socket等区别联系

    1.TCP连接 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上. ...

  2. [net]tcp和udp&socket

    参考 TCP和UDP连接 关于传输层TCP.UDP协议可能我们平时遇见的会比较多,有人说TCP是安全的,UDP是不安全的,UDP传输比TCP快,那为什么呢,我们先从TCP的连接建立的过程开始分析,然后 ...

  3. TCP和UDP Socket

    1.tcp协议的编程 * 1:客户端.步骤  *         1:创建Socket对象,构造方法里需要指定服务端的ip地址和端口.  *         Socket socket = new S ...

  4. 推荐一些socket工具,TCP、UDP调试、抓包工具 推荐一些socket工具,TCP、UDP调试、抓包工具

    还记得我在很久很久以前和大家推荐的Fiddler和Charles debugger么?他们都是HTTP的神器级调试工具,非常非常的好用.好工具能让你事半功倍,基本上,我是属于彻头彻尾的工具控. 假如有 ...

  5. 推荐一些socket工具,TCP、UDP调试、抓包工具 (转载)

    还记得我在很久很久以前和大家推荐的Fiddler和Charles debugger么?他们都是HTTP的神器级调试工具,非常非常的好用.好工具能让你事半功倍,基本上,我是属于彻头彻尾的工具控. 假如有 ...

  6. 推荐一些socket工具,TCP、UDP调试、抓包工具

    还记得我在很久很久以前和大家推荐的Fiddler和Charles debugger么?他们都是HTTP的神器级调试工具,非常非常的好用.好工具能让你事半功倍,基本上,我是属于彻头彻尾的工具控. 假如有 ...

  7. 老李分享:使用 Python 的 Socket 模块开发 UDP 扫描工具

    老李分享:使用 Python 的 Socket 模块开发 UDP 扫描工具 poptest是业内唯一的测试开发工程师培训机构,测试开发工程师主要是为测试服务开发测试工具,在工作中要求你做网络级别的安全 ...

  8. 网络编程协议(TCP和UDP协议,黏包问题)以及socketserver模块

    网络编程协议 1.osi七层模型 应用层  表示层  会话层  传输层  网络层  数据链路层  物理层 2.套接字 socket 有两类,一种基于文件类型,一种基于网络类型 3.Tcp和udp协议 ...

  9. VC++使用socket进行TCP、UDP通信实例总结

    1.        两台计算机通信需要协议,通信的两台计算机IP必须唯一 2.        同一个计算机可以进行多个应用程序与其他计算机通信,IP地址唯一,而端口号是区别同一计算机(同一IP)的唯一 ...

  10. 网络编程协议(TCP和UDP协议,粘包问题)以及socketserver模块

    网络编程协议 1.osi七层模型 应用层  表示层  会话层  传输层  网络层  数据链路层  物理层 2.套接字 socket 有两类,一种基于文件类型,一种基于网络类型 3.Tcp和udp协议 ...

随机推荐

  1. ThinkPHP 6.0 RC2 版本发布——架构升级、精简核心

    自从5.2版本变更为6.0以来,官方一直致力于优化架构和精简核心,同时也在准备手册和测试工作,在经过近1个月的开发迭代后,官方宣布发布ThinkPHP6.0RC2版本. 主要更新 相比较RC1版本更新 ...

  2. 基于python的数学建模---场线与数值解(微分方程)

    import numpy as np from scipy import integrate import matplotlib.pyplot as plt import sympy def plot ...

  3. ATM分析

    # 查看余额功能 1.第一层直接调用查看余额的接口(传当前登录用户名) 2.第二层直接调用第三层数据查询的接口 3.第二层从用户字典中提取出用户余额返回给第一层展示 # 账户提现功能 1.第一层获取用 ...

  4. Easy-Classification-验证码识别

    1.背景 Easy-Classification是一个应用于分类任务的深度学习框架,它集成了众多成熟的分类神经网络模型,可帮助使用者简单快速的构建分类训练任务.   案例源代码 Easy-Classi ...

  5. NavBarControl 通过代码添加

    看到网上很多都是直接在控件上面添加的 而我的是保存在数据库读取后添加的. 后来自己摸索了一下. 通过代码添加 navBarControl1.Groups.Add(new NavBarGroup( st ...

  6. 环境安装-Centos7.4安装及配置

    环境安装-Centos7.4安装及配置 〇.资料汇总 一.虚拟机安装 1.下载地址 https://pan.baidu.com/s/1zcOp06HX4OxPdsCCGkHbXQ 提取码:7777 2 ...

  7. 【实习项目介绍】XXXXX大数据平台介绍

    一.技术架构 1.整体介绍及架构 (1)概述 Odeon大数据平台以全图形化Web操作的形式为用户提供一站式的大数据能力:包括数据采集.任务编排.调度及处理.数据展现(BI)等:同时提供完善的权限管理 ...

  8. K8S的架构及工作原理

    1.Master和Node 1).Master K8S中的Master是集群控制节点,负责整个集群的管理和控制 在Master上运行着以下关键进程: kube-apiserver:提供了HTTP Re ...

  9. JavaScript入门⑧-事件总结大全

    JavaScript入门系列目录 JavaScript入门①-基础知识筑基 JavaScript入门②-函数(1)基础{浅出} JavaScript入门③-函数(2)原理{深入}执行上下文 JavaS ...

  10. kernel 启动流程

    一.概述 之前学习了uboot的启动流程,现在接着学习uboot的启动流程,关于 kernel 的启动流程分析的大佬也是很多的,这里还是通过流程的图的方式进行记录,为了像我一样的新手,直观的了解 ke ...