网络编程:osi七层协议、三次握手四次挥手、socket套接字编程

本文介绍了网络编程的基础,包括客户端/服务器架构,互联网协议的重要性。详细探讨了OSI七层协议,特别是TCP的三次握手和四次挥手过程。接着,文章通过Python讲解了基于TCP和UDP的Socket套接字编程,包括简单示例和并发实现,并分析了socketserver在并发处理中的作用。
摘要由CSDN通过智能技术生成


一、 客户端/服务器架构

1.硬件C/S架构(打印机)

2.软件C/S架构

互联网中处处是C/S架构

如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种)

腾讯作为服务端为你提供视频,你得下个腾讯视频客户端才能看它的视频)

C/S架构与socket的关系:

我们学习socket就是为了完成C/S架构的开发

学习网络编程的目的是为了开发一个CS架构或者BS架构的软件
Client------------网络------------------Server
Browser-----------网络------------------Server

什么是网络?
网络=物理连接设备+互联网通信协议(就是计算机界的英语)

为何要有网络?
网络-》信息高速公路
为了方便数据传输

二、互联网的本质就是一系列的网络协议

如果把计算机看成分布于世界各地的人,那么连接两台计算机之间的internet实际上就是一系列统一的标准,这些标准称之为互联网协议,互联网的本质就是一系列的协议,总称为‘互联网协议’(Internet Protocol Suite).

互联网协议的功能:定义计算机如何接入internet,以及接入internet的计算机通信的标准。

三、osi七层协议

互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层
在这里插入图片描述

每层运行常见物理设备
在这里插入图片描述

OSI七层协议数据传输的封包与解包过程
在这里插入图片描述

1、每层物理设备

 osi七层、5层(5层名字记住:重点)
	-物理层
    	-网线,光纤
    -数据链路层
    	-网卡
    -网络层
    	-路由器
    -传输层(运输层)
    	-四层路由器
    -应用层(会话层,表示层,应用层)
    	-http协议,ftp协议,websocket协议。。。

2、每一层功能

1 物理层
	-网线----01010101电信号---》从网线中传输电信号
    -8个比特位是一个字节
2 数据链路层
	-数据帧:一组电信号是一个数据帧,有头和数据部分
	-网卡---》mac地址---》全球唯一---》网卡出厂--》烧在了网卡上
    -48位二进制---》看到的都是16进制表示
    -广播:
   		-局域网内通信,所有人都会接受到,通过mac地址确定给谁的数据报,如果不是自己的就不处理
    -广播风暴
 3 网络层
	-跨局域网通信,需要经过网络层
    -IP地址:0.0.0.0-255.255.255.255
    -子网掩码:
    -192.168.1.1  255.255.255.0
    -192.168.2.1  255.255.255.0
    -ARP:ip和mac的对照表
    
 4 传输层:
	-端口:0--65535,一个应用程序可以监听多个端口,但是一个端口只能属于一个应用程序
    -TCP协议:可靠传输(可靠传输如何保证?三次握手,四次挥手)
    -UDP协议:不可靠传输
5 应用层
	-htpp,ftp,websocket....

3、 常用端口号

应用程序 FTP TFTP TELNET SMTP DNS HTTP SSH MYSQL
熟知端口 21,20 69 23 25 53 80 22 3306
传输层协议 TCP UDP TCP TCP UDP TCP TCP TCP

DNS:把网址转换成ip地址

从浏览器发送出去的数据,都是http协议,默认是80端口

4、 Tcp三次握手四次挥手(面试题)

1 tcp可靠传输:三次握手,四次挥手保证数据可靠
2 三次握手
	-客户端向服务端发送链接请求  1
    -服务端回复可以建立,并且带着跟客户端建立链接的数据报  2
    -客户端收到后,链接建好了    3
    
3 这个过程后就可以可靠传输数据

4 断开链接(4四挥手)
	-客户端告诉服务端,要断开   1
    -服务端收到,回复ok        2
    -服务端可能还有数据在传递,暂时还没断开---等数据传完
    -服务端告诉客户端,我要断了  3 
    -客户端收到,回复ok        4

四、基于TCP协议的socket套接字编程

1、 什么是Scoket

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

1 Socket抽象层,从osi七层抽象出来的,抽象了网络层和传输层,跟语言无关,任何语言都会有socket的封装
2 专门给开发人员用的

在这里插入图片描述

2、 套接字发展史及分类

套接字起源于 20 世纪 70 年代加利福尼亚大学伯克利分校版本的 Unix,即人们所说的 BSD Unix。 因此,有时人们也把套接字称为“伯克利套接字”或“BSD 套接字”。一开始,套接字被设计用在同 一台主机上多个应用程序之间的通讯。这也被称进程间通讯,或 IPC。套接字有两种(或者称为有两个种族),分别是基于文件型的和基于网络型的。

2.1基于文件类型的套接字家族

套接字家族的名字:AF_UNIX
unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信

2.2基于网络类型的套接字家族

套接字家族的名字:AF_INET
(还有AF_INET6被用于ipv6,还有一些其他的地址家族,不过,他们要么是只用于某个平台,要么就是已经被废弃,或者是很少被使用,或者是根本没有实现,所有地址家族中,AF_INET是使用最广泛的一个,python支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我么只使用AF_INET)

3、套接字工作流程

在这里插入图片描述

先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束,使用以下Python代码实现:

import socket

# socket_family 可以是 AF_UNIX 或 AF_INET。socket_type 可以是 SOCK_STREAM 或 SOCK_DGRAM。protocol 一般不填,默认值为 0
socket.socket(socket_family, socket_type, protocal=0)

# 获取tcp/ip套接字
tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 获取udp/ip套接字
udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 由于 socket 模块中有太多的属性。我们在这里破例使用了'from module import *'语句。使用 'from socket import *',我们就把 socket 模块里的所有属性都带到我们的命名空间里了,这样能大幅减短我们的代码
tcpSock = socket(AF_INET, SOCK_STREAM)

3.1 服务端套接字函数

方法 用途
s.bind() 绑定(主机,端口号)到套接字
s.listen() 开始TCP监听
s.accept() 被动接受TCP客户的连接,(阻塞式)等待连接的到来

3.2 客户端套接字函数

方法 用途
s.connect() 主动初始化TCP服务器连接
s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常

3.3 公共用途的套接字函数

方法 用途
s.recv() 接收TCP数据
s.send() 发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
s.sendall() 发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)
s.recvfrom() 接收UDP数据
s.sendto() 发送UDP数据
s.getpeername() 连接到当前套接字的远端的地址
s.getsockname() 当前套接字的地址
s.getsockopt() 返回指定套接字的参数
s.setsockopt() 设置指定套接字的参数
s.close() 关闭套接字

3.4 面向锁的套接字方法

方法 用途
s.setblocking() 设置套接字的阻塞与非阻塞模式
s.settimeout() 设置阻塞套接字操作的超时时间
s.gettimeout() 得到阻塞套接字操作的超时时间

3.5 面向文件的套接字的函数

方法 用途
s.fileno() 套接字的文件描述符
s.makefile() 创建一个与该套接字相关的文件

4、基于TCP协议的套接字编程(简单)

  • 可以通过netstat -an | findstr 8080查看套接字状态

服务端

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值