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. Go语言核心36讲11

    至今为止,我们讲过的集合类的高级数据类型都属于针对单一元素的容器. 它们或用连续存储,或用互存指针的方式收纳元素,这里的每个元素都代表了一个从属某一类型的独立值. 我们今天要讲的字典(map)却不同, ...

  2. Destination folder must be accessible

    问题 Ecplise拖入文件夹项目时提示错误:Destination folder must be accessible 解决 导入的时候包不能直接拖入,要使用import导入,选择File-> ...

  3. 写一个frida通杀脚本

    1. 前言 过年对我来说和平常没什么区别,该干什么干什么. 之前没接触过 frida 这个工具,前几天用了一些时间学习了一下,相比于 xposed hook 框架,frida 相对于调试方面真的很方便 ...

  4. 关于sublime text 3写一个插件

    前言 我之前一直想写一个记录自己笔记的软件,可以给因为我都记录在桌面的便签上很乱,以至于便签上满满的全是字母,很难看,但是我有不想写图形化界面,所以最终我选择了写一个sublime 插件,功能就是记录 ...

  5. freemarker if 回填CheckBox思路

    开发场景中遇到这样的一个问题,在网上也找了一些结局方法,但不成功,于是自己写了一个笨一点的方法,算是一种方法,希望对遇到该开发场景的朋友有所帮助. freemarker html代码: <tab ...

  6. 【十次方微服务后台开发】Day02:加密与JWT鉴权、微服务注册中心、配置中心、熔断器、网关、消息总线、部署与持续集成、容器管理与监控Rancher、influxDB、grafana

    一.密码加密与微服务鉴权JWT 1.BCrypt密码加密 Spring Security 提供了BCryptPasswordEncoder类,实现Spring的PasswordEncoder接口使用B ...

  7. go-carbon 1.5.1 版本发布, 修复已知 bug 和新增土耳其翻译文件

    carbon 是一个轻量级.语义化.对开发者友好的golang时间处理库,支持链式调用. 目前已被 awesome-go 收录,如果您觉得不错,请给个star吧 github.com/golang-m ...

  8. SQL注入漏洞原理与利用

    SQL注入漏洞原理与利用 SQL注入漏洞流程 判断注入类型 判断字段个数 查询回显位 查询数据库名 查询表.字段名 查询内容 判断注入类型 1.数字型注入点判断 当要输入的参数x为数字型时,后端脚本中 ...

  9. 《HTTP权威指南》– 1.HTTP概述

    HTTP的概念 HTTP : Hypertext Transfer Protocol 超文本传输协议 因特网上有数千种不同的数据类型,HTTP仔细地给每种要通过Web传输的对象都打上了名为MIME类型 ...

  10. before-after-hook钩子函数

    before-after-hook 最近看别人的代码,接触到一个插件,before-after-hook,百度搜一圈也没有看到什么地方有教程,看这个字面意思是一个hook,和axios里面的拦截器,v ...