网络socket编程(一)

简介:本文旨在学习网络socket编程相关知识,同时也会介绍一些计算机网络知识作为基础。

一、网络通信

1.网络应用系统与网络服务架构

大部分的网络应用系统可以分为两部分:客户端(Clien)和服务器端(Server),网络服务架构一种是CS模式,另一种是BS模式。

CS即Client/Server(客户机/服务器)架构(需要安装客户端软件才能访问服务器)

        优点:在技术上很成熟,主要特点是交互性强、具有安全的存储模式、网络通信量低、响应速度快,可以很好的处理大数量的数据。

        缺点:因为是针对性开发,所以不够灵活,缺少通用性,维护和管理的难度大。

BS即Browser/Server(浏览器/服务器)架构(通过网址就能访问服务器)

        优点:分布性强、维护方便、开发简单且共享性强,总体拥有成本低。

        缺点:数据安全性较低,对服务器要求高,数据传输速度过慢,软件个性化特点明显降低,实现复杂的应用构造有较大的困难。 

(1)OSI七层模型

        是一个把网络通信在逻辑上的定义,也可以理解成为定义了通用的网络通信规范。我们的数据在传输的过程,实际上就是如下图所示的封装和解封装的过程,发送方通过各种封装处理把数据处理成比特流的形式,接收方在通过各种解封装处理把数据还原。

<1>物理层

        规定了如何为网络通信实现最底层的物理连接,以及物理设备的机械、电气、功能和过程特性。 

<2>数据链路层

        规定了如何进行物理地址寻址、如何在物理线路上进行数据(帧)的可靠传递以及流量控制。数据链路层有SLIP协议、CSLIP协议、PPP协议等。交换机是属于数据链路层的。

<3>网络层

        规定了通过哪些网络节点(IP地址)、什么样的网络路径来讲数据从发送方发送到接收方。

<4>传输层

         负责总体的数据传输和数据控制,提供端到端的交换数据机制。传输层对于数据段进行分割和重组,并且进行流量控制和根据接收方的接收数据能力确定适当的传输速率。传输层协议有TCP协议、UDP协议等。

<5>会话层 

        在网络中的两个节点之间建立、维持和终止通信。

<6>表示层 

        在应用程序和网络之间对数据进行数据格式化,使其能够被另一方理解。即发送方的表示层将应用程序的抽象语法转换成网络适用于OSI网络传输的传送语法,接收方相反。除此之外,还可以对数据进行加密和解加密。

<7>应用层 

        为应用程序程序提供网络服务。

(2)TCP/IP协议 

        虽然OSI协议是国际上提出的一个标准,但是由于其定义的太过复杂而错过了时间节点,让TCP/IP协议成为了计算机网络通信的事实标准。“TCP/IP协议”在名字上好像只是TCP协议和IP协议,但是在实际上这是很多协议组成的一个协议集合,我们把这个协议统称为TCP/IP协议族,简称TCP/IP协议 。对于TCP/IP协议 ,共分为以下四层:应用层、传输层、网络层和数据链路层。但是在实际生活应用中,常用TCP/IP五层模型来描述计算机网络。

<1>网络接口层

        (1)主要作用一:数据封装/解封装成帧。为了保证可靠的网络传输 ,网络层传过来的数据在这里被加工成了可被物理层传输的结构包——帧。帧中除了包括要传输的数据以外,还包括发送方以及接收方的物理地址及检错信息。帧的结构如下:

        (2)主要作用二:控制帧传输。主要体现在反馈重发、计时器、帧序号方面。接收方通过对帧的差错编码(奇偶校验码或CRC码)的检查,来判断在传输过程中是否出错,并进行反馈,如果发送错误,则需要重发纠正。发送端在发送帧时会启动定时器,在帧发送一段时间之后没有接到反馈,会自动重发。为了避免多次收到同一帧并将其递交给网络层的情况发生,则需要对每一个帧进行编号,以此确定是否重复接收。

        (3)主要作用三:流量控制。由于收发双方使用的设备可能存在工作速率和缓冲存储空间的差异,可能出现发送方的发送能力大于接收方接收能力的现象,如果此时不对发送方的发送速率进行控制,将会造成帧淹没现象,从而丢失帧而出错。所以流量控制是对发送方数据流量的控制,使其发送速率不超过接收速率,所以需要一些规则使得发送方知道在什么情况下知道发送下一帧,在什么情况下知道暂停,知道得到某些反馈下继续发送。      

<2>网络层

        IP协议是TCP/IP协议族中最为核心的协议。所有的TCP、UDP、ICMP、IGMP协议数据都以IP数据报格式传输。IP协议提供的是不可靠的、无连接的数据报传输服务。不可靠是指IP协议不会保证数据能否成功到达目的地,仅提供传输服务,传输出错,则会丢弃出错的数据报。无连接是指IP协议对数据报的处理是独立的,这也意味着接收方不一定会按照发送数据接收数据报。IP报数据格式如下:

IP地址分类:

<3>传输层
UDP(User Datagram Protocol)协议

        UDP即用户数据报协议,其传输机制决定了他的最大优点——快,同时也决定了他的最大的缺点——不可靠、不稳定。

        UDP是无连接的,发送数据之前不需要建立连接,减少开销和延时;(TCP协议需要提前连接)

        UDP是面向报文的,对IP数据制作简单封装,减少报头开销;

        UDP没有阻塞机制,不会造成延时;

        UDP支持一对一、一对多、多对一、多对多通信;

 UDP报文结构

TCP(Transmission Control Protocol)协议 

        相对于UDP,TCP是面向连接的、提供可靠的数据传输服务。同时也比UDP开销更大、传输速度较慢的。

        TCP提供可靠的、面向连接的数据传输服务。在通信之前要“三次握手”建立连接,结束之后还要使用“四次握手”断开连接;

        TCP是点对点连接,一条TCP只能连接两个端点;

        TCP提供可靠传输,无差错,不丢失,不重复,按顺序;

        TCP提供全双工通信;

        TCP面向字节流。

TCP报文结构

TCP建立的三次握手

Ⅰ Client先向Server发送连接请求报文段,同步自己的seq(x),Client进入到SYN_SENT状态;

Ⅱ Server接收到Client的连接请求报文段,返回给Client自己的seq(y)以及ack(x+1),Server进入到SYN_REVD状态;

Ⅲ Client接受到Server的返回确认,再次向服务器发送确认报文段ack(y+1),这个报文段已经携带数据,Client进入到ESTABLISHED状态;

Ⅳ Server接受到Client的确认信息后,进入到ESTABLISHED状态;

TCP断开的四次握手

Ⅰ Client向Server发送断开连接请求的报文段,seq = m(m是Client最后一次向Server发送报文段的最后一个字节序号+1),Client进入到FIN-WAIT-1状态;

Ⅱ Server收到断开报文段后,向CLient发送确认报文段,seq = n(n为Server最后一次向Client发送报文段的最后一个字节序号+1),ack = m+1,Serv进入到CLOSE-WAIT状态。此时Server处于半开半闭状态,客户端如果发消息的话依旧可以收到;

Ⅲ Server向Client发送断开确认报文段,seq = u(u为半开闭状态下Server最后一次向Client发送报文段的最后一个字节序号+1),ack = m+1,Server进入到LAST-ACK阶段;

Ⅳ Client收到server的断开确认文段后,向server发送确认断开报文,seq=m+1,ack = u+1,Client进入到TIME-WAIT状态;

Ⅴ Server收到Client确认断开之后,进入到CLOSE过程,单开TCP连接;

<4>应用层

        下面是常见的应用层协议使用的端口:

        端口号是16位的,范围是0~65535。1~1024叫做“众所周知的端口”,监听范围该范围内端口的程序必须以root权限运行。 从1025~65535的端口被称为动态端口,可用来建立与其他主机的会话,也可由用户自定义用途。所以我们在写服务器程序时,你办使用该范围内的端口,当然应该尽量避免一些知名的端口或者当前系统正在使用的端口。

 二、socket编程

1.socket通信简介

        socket是应用层与TCP/IP协议族通信的中间软件通信层。具体如下:

socket网络通信的原理类似于打电话。例如:A要给B打电话,A拨号后B听到电话后接听电话后A和B建立起连接,A和B就可以开始讲话了,挂掉电话断开连接。显而易见,socket的工作原理:“open——write/read——close”模式,下面是网络socket通信的基本流程:

        

         

         

  • 24
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Socket(套接字)是网络编程中的一种抽象概念,它提供了一种在应用程序之间进行通信的机制。Socket 可以在同一台计算机上的进程之间进行通信,也可以在不同计算机上的进程之间进行通信。 在 Python 中,可以使用 socket 模块来实现 Socket 编程。以下是一个简单的示例,该程序使用 TCP 协议在本地主机上的端口号 9999 上创建一个服务器,并等待客户端连接: ```python import socket # 创建一个 Socket 对象 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 获取本地主机名和端口号 host = socket.gethostname() port = 9999 # 绑定端口号 server_socket.bind((host, port)) # 监听客户端连接 server_socket.listen(5) while True: # 等待客户端连接 client_socket, addr = server_socket.accept() print(f"连接地址:{str(addr)}") # 向客户端发送消息 message = "欢迎访问服务器!" client_socket.send(message.encode("utf-8")) # 关闭连接 client_socket.close() ``` 客户端程序可以通过以下代码连接到该服务器: ```python import socket # 创建一个 Socket 对象 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 获取本地主机名和端口号 host = socket.gethostname() port = 9999 # 连接服务器 client_socket.connect((host, port)) # 接收服务器发送的消息 message = client_socket.recv(1024) print(f"收到消息:{message.decode('utf-8')}") # 关闭连接 client_socket.close() ``` 这只是 Socket 编程的一个简单示例,实际上 Socket 编程可以实现更复杂的应用程序,例如 Web 服务器和聊天应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值