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. C语言嵌套for循环实现冒泡排序

    使用嵌套for循环实现冒泡排序的一个函数. #include<stdio.h> /** * 介绍: * 使用嵌套for循环实现冒泡排序,由小到大(上小下大). * 参数: * sum[]: ...

  2. 谈软件-专家谈C/C++重构的操作与思路

    1.Refactoring: 对软件内部结构的一种调整,目的是不该被软件的可观察行为的前提上,提高其可理解性,降低其修改成本. 2.代码坏味道 2.1.不易复用 2.2.不易理解 2.3.存在冗余 3 ...

  3. ctfshow web入门部分题目 (更新中)

    CTFSHOW(WEB) web入门 给她 1 参考文档 https://blog.csdn.net/weixin_51412071/article/details/124270277 查看链接 sq ...

  4. 把Mybatis Generator生成的代码加上想要的注释

    作者:王建乐 1 前言 在日常开发工作中,我们经常用Mybatis Generator根据表结构生成对应的实体类和Mapper文件.但是Mybatis Generator默认生成的代码中,注释并不是我 ...

  5. Kafka事务原理剖析

    一.事务概览 提起事务,我们第一印象可能就是ACID,需要满足原子性.一致性.事务隔离级别等概念,那kafka的事务能做到什么程度呢?我们首先看一下如何使用事务 Producer端代码如下 Kafka ...

  6. .NET 6 实现滑动验证码(二)、基本数据

    上一节,介绍了滑动验证码的基本情况,也创建了一个.NET 6的工程.本节内容是创建一些基础类. 目录 CaptchaData.cs CaptchaValidateData.cs ImageCaptch ...

  7. HashMap为何线程不安全?HashMap,HashTable,ConcurrentHashMap对比

    这两天写爬虫帮组里收集网上数据做训练,需要进一步对收集到的json数据做数据清洗,结果就用到了多线程下的哈希表数据结构,猛地回想起自己看<Java并发编程的艺术>框架篇的时候,在Concu ...

  8. day28 BOM浏览器对象 & 定时事件与Cookie & (视频卷子讲解)

    3.10 BOM浏览器对象模型 3.10.1 window对象 所有浏览器都支持window对象,它表示浏览器窗口: | 属性 | history 网页历史记录 返回History只读对象 locat ...

  9. 【离线数仓】Day02-用户行为数据仓库:分层介绍、环境搭建(hive、tez)、LZO压缩、建表查询导入加索引、编写脚本

    一.数仓分层概念 1.为什么要分层 ODS:原始数据层 DWD层:明细数据层 DWS:服务数据层 ADS:数据应用层 2.数仓分层 3.数据集市与数据仓库概念 4.数仓命名规范 ODS层命名为odsD ...

  10. 1.5 HDFS分布式文件系统-hadoop-最全最完整的保姆级的java大数据学习资料

    目录 1.5 HDFS分布式文件系统 1.5.1 HDFS 简介 1.5.2 HDFS的重要概念 1.5.3 HDFS架构 1.5 HDFS分布式文件系统 1.5.1 HDFS 简介 HDFS(全称: ...