网络编程_基本概念

网络编程

网络编程 - 基本概念

网络通信概述

1.什么是网络?

  • 网络是一种辅助双方或者多方能够连接在一起的工具
  • 如果没有网络,可想 单机的世界是多么的孤单

2.使用网络的目的

  • 就是为了联通多方然后进行通信用的,即把数据从一方传递给另外一方
  • 前面的学习编写的程序都是单机的,即不能和其他电脑上的程序进行通信
  • 为了让在不同的电脑上运行的软件之间能够互相传递数据,就需要借助网络的功能

总结

  • 使用网络能够把多方链接在一起,然后可以进行数据传递
  • 所谓的网络编程就是,让不同的电脑上的软件能够进行数据之间的传递,即进程之间的通信。

IP地址

  • 就是互联网协议地址,也叫网际协议地址 【192.168.0.1】
  • 目的就是用来标记网络上的一台电脑且不能重复

Linux、Windows 查看网卡信息

  • Linux:ifconfig
  • Window:ipconfig

IP地址的分类

  • ip v4:ip version 4 示例:xxx.xxx.xxx.xxx
  • ip v6:ip version 6 示例:“fe80::85a7:2688:6ab9:abbd%11”

端口

  • 端口就好比一个房子的门,是出入房子的必经之路

简述聊天信息的发送

dest ip(目的ip):192.168.1.1      -----> dest ip(目的ip):192.168.1.1
src ip(源ip):192.168.1.2
dest port(目标端口):7788        -----> dest port(目标端口):7788
src port(源端口):4567
content:你好啊             -----> content:你好啊

端口号

  • 端口是通过端口号来进行标记的,端口号只有整数,范围是 0~65535
  • 注意:端口数不一样的*nix系统不一样,还可以手动修改

端口的分类

端口是怎样分配的?

  • 端口号不是随意使用的,而是按照一定的规定进行分配的。
  • 端口的分类有好几种,下面我们介绍几种常见的端口分类

周知端口(Well Known Ports):

周知端口就是众所周知的端口号,范围从0到1023,其中80端口分配给WWW服务,21端口分配给FTP服务等。我们在IE的地址栏里输入一个网址的时候是不必指定端口号的,因为在默认情况下WWW服务的端口是“80”。网络服务是可以使用其他端口号的,如果不是默认的端口号则应该在地址栏上指定端口号,方法是在地址后面加上冒号“:”,再加上端口号。比如使用 “8080”作为WWW服务的端口,则需要在地址栏里输入“网址:8080”。
但是有些系统协议使用固定的端口号,它是不能被改变的,比如139 端口专 门用于NetBIOS与TCP/IP之间的通信,不能手动改变。从0到1023,它们紧密绑定于一些服务,一般不可随意更改和占用。

注册端口(Registered Ports)
端口1024到49151,分配给用户进程或应用 程序。这些进程主要是用户选择 安装的一些应用程序,而不是已经分配好了公认端口的常用程序。这些端口在 没有被服务器资源占用的时候,可以用于用户端动态选用为源端口。

动态/私有端口(Dynamic and/or Private Ports)
动态端口的范围是从49152到65535。之所以称为动态端口,是因为它 一般 不固定分配某种服务,而是动态分配。
从49152到65535。理论上,不应为服务分配这些端口。实际上,机器通常从 1024起分配动态端口。但也有例外:SUN的RPC端口从32768开始

如何查看端口

  • 用“netstat -an”查看端口状态
  • lsof -i[tcp:udp]:2425

总结

端口有什么用呢?
我们都知道,一台拥有IP地址的主机可以提供很多服务,比如HTTP(万维网服务)、FTP(文件传输)、SMTP(电子邮件)等,这些服务完全可以通过一个IP地址来实现。那么,主机是怎样区分不同的网络服务呢?显然不能只靠IP地址,因为IP地址与网络服务的关系是一对多的关系。实际上是通过“IP地址+端口号”来区分不同的服务的,需要注意的是,端口并不是一一对应的。比如你的电脑作为客户机访问一台WWW服务器的时候,WWW服务器使用“80”端口与你的电脑通信,但你的电脑则可能使用“3456”这样的端口。

socket简介

不同的电脑上的进程之间如何通信

  • 首先解决的问题是如何唯一标示一个进程,否则通信无从谈起!
  • 在一台电脑上可以通过进程号(PID)来唯一标识一个进程,但是在网络中这是行不通的。
  • 其实TCP/IP协议族已经帮我们解决了这个问题,网络层的“IP地址”可以唯一表示网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用进程(进程)
  • 这样利用IP地址、协议、端口就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其他进程进行交互。

注意:

  • 所谓**‘进程’**指的是:运行的程序以及运行时用到的资源这个整体称之为进程
  • 所谓的**‘进程间通信’**指的是:运行的程序之间的数据共享

什么是socket?

  • 是用来完成网络通信的必备的“协议”。
  • 其实socket本身并不是协议,它是应用层与TCP/IP协议族通信的中间软件抽象层,是一组调用接口(TCP/IP网络的API函数)。

网络有一段关于socket和TCP/IP协议关系的说法比较容易理解

TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。 
这个就像操作系统会提供标准的编程接口,比如win32编程接口一样。 
TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口。
实际上,传输层的TCP是基于网络层的IP协议的,而应用层的HTTP协议又是基于传输层的TCP协议的,
而Socket本身不算是协议,就像上面所说,它只是提供了一个针对TCP或者UDP编程的接口。

**socket(简称 ‘套接字’)**是进程之间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于Socket来完成通信的。
例如我们每天浏览的网页、QQ聊天、收发Email等等。

创建socket

在Python中 使用socket 模块的函数 socket就可以完成

import socket
socket.socket(AddressFamily,Type)

说明:

函数 socket.socket创建一个 cosket,该函数带有两个参数:

  • AddressFamily:【协议族】可以选择AF_INET(用于Internet进程间通信)或者AF_UNIX(用于同一台机器进程间通信),实际工作中常用AF_INET
  • Type:套接字类型,可以是SOCK_STREAM(流式套接字,主要用于TCP协议)或者SOCK_DGRAM(数据报套接字,主要用于UDP协议)

创建一个tcp socket(tcp套接字)

import socket

# 创建tcp的套接字
s = socket.socket(socket.AE_INET, socket.SOCK_STREAM)


# ...这里是使用套接字的功能(省略)...


# 不用的时候,关闭套接字
s.close()

创建一个udp socket(udp套接字)

import socket

# 创建tcp的套接字
s = socket.socket(socket.AE_INET, socket.SOCK_DGRAM)


# ...这里是使用套接字的功能(省略)...


# 不用的时候,关闭套接字
s.close()


说明

  • 套接字使用流程 与 文件的使用流程很类似
    • 1.创建套接字
    • 2.使用套接字收/发数据
    • 3.关闭套接字

猜你喜欢

转载自blog.csdn.net/weixin_42250835/article/details/89008260