2020-08-27网络编程基础

网络编程基础

一. IP地址的介绍

1. IP地址概念: 标识网络中某个设备的一个地址,相当于现实生活中你得家庭地址

2 IP地址的表现形式,目前分为两类:

  • IPV4 目前使用的IP地址,由点分十进制组成. 例如:192.168.33.1
  • IPV6 未来使用的IP地址,是由冒号十六进制组成.例如:fe80::9d70:b5d1:879a:351a%23

3 IP地址的作用: IP地址的作用是标识网络中唯一的一台设备的,通过IP地址能找到网络中的某台设备

 

 

 

4 域名就是IP地址的别名

5 查看网卡信息(网卡信息内有IP地址):

  • Windows系统 ipconfig
  • Linux和Macos系统 中 ifconfig

二. 端口和端口号

1.端口概念: 端口是传输数据的通道,数据的传输是通过端口进行的.

2.端口号: 只有通过端口号才能找到端口,就像门牌号与对应门的关系一样.想要找到端口来传输数据,找到对应的端口号就可以了.端口号有65536个..

3.数据传输流程: 通过IP地址找到对应的设备,通过端口号找到对应的端口,通过端口传输数据.

4. 端口和端口的关系:端口号可以标识唯一的一个端口

5.端口号分类:

  • 知名端口号
  • 动态端口号

知名端口号:众所周知的端口号,范围0到1023

动态端口号:一般程序员开发应用程序时使用的端口号为动态端口号,范围是1023到66535

6 注:

如果开发时没有设置端口号,操作系统会随机生成一个端口号来供应用程序使用

运行程序默认有一个端口号,当程序退出时,释放端口号

三.TCP协议

1.网络之间是如何通信的

在通过ip地址和端口号传输数据之前,还要选择一个协议来进行传输,保证数据是按照指定的传输规则来进行传输的.TCP就是一种传输规则

2.TCP概念和特点:

TCP全称传输控制协议,是一种面向连接的、可靠地、基于字节流的传输层通信协议

3.TCP协议的通讯步骤

  • 建立连接
  • 传输数据
  • 关闭连接

建立连接:通信双方必须建立好连接之后才能进行数据的传输,当数据传输完成后,通讯双方必须断开连接,以此释放系统资源.

可靠稳定的传输:

  • 发送应答机制
  • 超时重传
  • 错误校验
  • 流量控制和阻塞管理

四.socket(套接字)

1.socket 作用:进程之间进行网络通信都要依靠socket(套接字).负责进程之间网络数据传输.例如一个搬运工

2 应用场景:只要跟网络相关的应用程序和应用软件都用的上socket

3 网络数据传输流程:

 

五.TCP网络开发流程

1.客户端程序和服务端程序:运行在用户设备的程序叫做客户端程序,运行在服务器的程序叫做服务端程序.

2.客户端程序开发流程:

socket(套接字)→建立连接(connect)→send发送数据→recv接收数据→关闭连接

细节详解:

  • 导入socket套接字模块
  • 创建socket套接字对象,方法:socket.socket(AddressFamily,Type) 第一个参数是IP地址类型,有IPv4 和 IPv6 两种。socket.AF_INET表示ipv4 .第二个参数是传输协议类型,socket.SOCK_STREAM表示TCP传输协议.
  • 建立连接:套接字对象.connect(('ip地址',端口号)) connect的参数是一个元组,包含两个数据,ip地址和端口号. 指的是服务器的地址和端口号.
  • 发送数据:套接字对象.send(数据) 注:数据要提前准备并进行转码,转化成二进制数据
  • 接收数据:套接字对象,recv(self) recv里的参数是可接收数据的最大长度 自己规定.接收到的数据也要进行解码
  • 关闭客户端套接字对象: 套接字对象.close()

 

3.服务端程序开发流程:

socket(套接字)→bind(绑定端口号)→listen(设置监听)→accept(等待连接请求)→recv(接收数据)→send(发送数据)→close(关闭套接字)

细节详解:

  • 导入socket套接字模块
  • 创建socket服务端对象.socket.socket(socket.AF_INET,socket.SOCK_STREAM),socket.AF_INET是IP地址类型,socket.SOCK_STREAM是TCP传输协议类型
  • 绑定端口号. socket.bind(('',port)) 参数为一个元组,元组第一个数据是IP地址,第二个参数是端口号.注意,IP地址可不指定,即为本机的任意一个IP地址.
  • 设置监听 socket对象.listen(self) 其中的参数是设置等待的最大连接数
  • 等待连接请求 socket对象.accept() 等待连接,接收的数据是一个元组.(new_socket,ip_port),第一个参数是一个新的套接字,负责进行下面的接收和发送数据.第二个参数是ip地址和端口号的元组. 注: 使用拆包分别得到这两个数据,代码执行到此,说明连接建立成功.
  • 接收数据: 新socket对象.recv() 设置接受的最大字节长度 然后对接收的二进制数据进行转码,打印转码后的数据
  • 发送数据: 新socket对象.send() 也需要对发送的数据进行转码
  • 关闭和客户端通讯的新套接字 终止本次通信
  • 关闭服务端的套接字, 终止和客户端建立连接的请求,停止服务.

 

3.1 为什么客户端连接到服务端会返回一个新的套接字,服务端的工作流程是什么

当一个客户端连接上服务端之后,服务端会建立一个新的套接字来服务客户端.客户端可以根据该套接字进行发送,接收数据的操作.之所以要新建套接字,因为服务端套接字不能只和一个客户端进行连接.他还要接入其他客户端.这样的操作原理就类似于10086,当你接入时,会分配一个客服来给你服务,而不是客户主机.

4.端口号复用

问题原因: 当服务器和客户端连接后,服务端程序退出后,端口号不会立即释放,需要等待大概1-2分钟

  • 解决方法:更换新的服务端端口号
  • 设置端口号复用

端口号复用:

ttcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

  • 第一个参数:表示当前套接字
  • 第二个参数: 设置端口号复用选项
  • 第三个参数: True

5.TCP网络应用程序的注意点

  • 当 TCP 客户端程序想要和 TCP 服务端程序进行通信的时候必须要先建立连接
  • TCP 客户端程序一般不需要绑定端口号,因为客户端是主动发起建立连接的。
  • TCP 服务端程序必须绑定端口号,否则客户端找不到这个 TCP 服务端程序。
  • listen 后的套接字是被动套接字,只负责接收新的客户端的连接请求,不能收发消息。
  • 当 TCP 客户端程序和 TCP 服务端程序连接成功后, TCP 服务器端程序会产生一个新的套接字,收发客户端消息使用该套接字。
  • 关闭 accept 返回的套接字意味着和这个客户端已经通信完毕。
  • 关闭 listen 后的套接字意味着服务端的套接字关闭了,会导致新的客户端不能连接服务端,但是之前已经接成功的客户端还能正常通信。
  • 当客户端的套接字调用 close 后,服务器端的 recv 会解阻塞,返回的数据长度为0,服务端可以通过返回数据的长度来判断客户端是否已经下线,反之服务端关闭套接字,客户端的 recv 也会解阻塞,返回的数据长度也为0。

六.案例-多任务版TCP服务端程序开发

1 可以使用while True 循环进行一个服务端服务多个客户端,但是这种方法是不同步的,是排队形式的,第二个客户端只能等待第一个链接结束才能进行连接,无法做到多任务.

2 线程开发多任务版TCP服务端程序

需求: 可以同时多个客户端对TCP服务端进行连接,可以多次进行对话.

代码流程:

  • 创建服务端套接字
  • 设置端口号复用
  • 绑定端口号
  • 设置监听
  • 循环等待接收客户端连接请求,当接收到请求,打印连接成功,显示客户端IP地址和端口号
  • 交给子线程执行
  • 启动子线程
  • 封装处理数据的函数,函数有两个参数,分别是用来接收和发送数据的新套接字,另一个是显示客户端信息的IP地址端口号.
  • 在封装函数内判断接受的数据是否为0,如果为0,则break打断循环,然后断开连接.如果不为0,转码并打印,然后发送转码数据.
  • 设置子进程守护主进程
  • 启动子进程

交给子线程的任务

 

线程的创建和循环等待用户请求

 

 

3.详解: 建立多任务版tcp服务端程序的主要原因是可以同时服务多个客户端,所以需要将每一个接收到的客户端请求交给子线程去处理.在任务中,循环接收和发送数据,就可以完成多次对话.每当新接收一个客户端,就会传入新的套接字和IP地址,就会创建一个新的线程处理任务.这样就可以完成多任务.

 

七.socket之send和recv原理

1 发送缓冲区和接收缓冲区

当创建TCPsocket对象时,会在内存中开辟一块空间,这个空间是就发送缓冲区和接收缓冲区.

2 send原理

当应用程序发送数据时,不是直接发送给服务器,而是应用程序将数据写到发送缓冲区,再由操作系统控制网卡将发送缓冲区的数据发送到服务端网卡.

3 recv原理

当服务端接收数据时,不是直接接收数据,而是操作系统通过网卡接收数据,把接收的数据写入到接收缓冲区,应用程序再从接收缓冲区获取数据.

4 原理剖析图

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值