网络编程基础

 

 一.网络编程

首先我们要明确一个问题,为什么要用网络编程?因为我们所写的代码程序不只是给自己看的,自己玩的,那样就没什么意义了.网络编程的意义就是将很多的电脑连接起来共享你们之间的文件

二.软件开发的架构

软件开发的架构有两种 

1. c/s架构

  c/s 即:Client与Server 架构简单的说就是客户端与服务器架构.这种架构也是从用户层面(也可以是物理层面)来划分的.

2.B/S架构

  B/S即:Browser与Server,大概意思就是浏览器端与服务器端架构.这种架构是从用户层面来划分的.Browser浏览器,其实也是一种Client客户端,只是这个客户端不需要大家安转什么应用程序.只需在浏览器上通过HTTP请求服务器相关的资源(网页资源),客户端Broeser浏览器就能进行增删改查

三.网络基础

  1.早期:联机

  以太网:局域网与交换机

  2.广播

 主机之间"一对所有"的通讯模式,网络对其中每一台主机发出信号都进行无条件复制并转发,所有主机都可以接受到所有信息(不管你需要不需要).由于其不用路径选择,所以其网络成本可以很低廉.有线电视就是典型的广播型,我们的电视机实际上是接受所有的频道的信号,但只将一个频道的信号还原成画面.在数据网络中也允许广播的存在.但其被限制在二层交换机的局域网范围内,禁止广播数据穿过路由器,防止广播数据影响大面积的主机

3.IP地址与IP协议

  (我们到某个地方插上网线,路由器或交换机中的DHCP服务为我们自动分配IP地址)

  规定网络地址的协议叫IP协议,它定义的地址称之为IP地址,广泛采用的V4版本即IPV4,他规定网络地址由32位2进制表示

  范围0.0.0.0 - 255.255.255.255
  一个IP地址通常写成四段十进制数:192.168.1.1

4.MAC地址

  (我们电脑有网卡,网卡里面有MAC地址出厂时就烧制在硬件上)

  head中包含的源和目标地址由来:ethernet规定接入internet的设备都必须具备网卡,发送端和接受端的地址便是指网的地址,.即MAC地址

  MAC地址:每块网卡出厂时都被烧制上世界上唯一的MAC地址,长度为48位2进制,通常有12位16进制数表示(前六位是厂商编号,后六位是流水线号)

5.arp协议----查询IP地址和MAC地址的对应关系

 地址解析协议,即ARP,是根据IP地址获取物理地址的一个TCP/IP协议.

 主机发送信息时将包含目标IP地址的ARP请求广播到网路上的所有主机,并接受返回消息,以此确定目标的物理地址

 收到返回消息后将该IP和物理地址存入本机ARP缓存中并保留一定的时间,下一次请求时直接查询ARP缓存一节约资源

 地址解析协议是建立在网路中各个主机之间相互信任的基础之上的,网路上的主机可以自主发送ARP应答消息,其它主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存.由此攻击者就可以向某一主机发送ARP应答报文,是其发送的信息无法到达预期的主机或到达错误的主机这就构成了一个ARP欺骗,ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系,添加或删除静态对应关系等.相关协议有RARP.代理ARP.NDP用于在IPv6中替代地址解析协议

  广域网与路由器

 6.DNS 

  网络连接

     1 域名解析

     2 连接

问题来了?域名和IP的对应关系在哪里?

  首先是在本地host 中找

  windows

  在c:\windows \systm32\driver\etc\host

  linux\mac电脑

  \ect\host中找

DNS服务器:全球顶级的有13个

 更多网络知识参考http://www.cnblogs.com/Eva-J/articles/8066842.html

7.端口

  什么是端?为什么要有端口?

端口是为了将同一个电脑上的不同程序进行隔离.   简单的说IP找电脑,端口找电脑上的程序

示例:

      Mysql是一个软件,软件帮助我们在硬盘上进行文件的操作,默认端口是33.6

  Redis是一个软件,软件帮助我们在内存进行数据操作,默认端口6379

拓展知识:网站的默认端口是80 访问的是Htttp://  而https://的默认端口是4430    

范围

  那么端口到底有多少?  答:一共有1-65535个有些不能用1-1024这些端口有特殊的用途所以一般不用1024之后的都是可以正常使用的

小技巧:一般程序员大多在用8000以上的端口.没有为什么,都是约定俗称,当然你也可以用除了8000之外的这个没有特殊要求

8.osi7层,模型

首先先抛出概念 一会慢慢解释,有哪7层呢?

  1.应用层    

  2.表示层

  3.会话层

  4.传输层

  5,网路层

  6.数据链路层

  7.物理层

其实osi的模型分类有好多种 一张图来说明一下

简单拿你手机访问淘宝来说  你使用的淘宝软件就属于应用层,在淘宝里面看到的数据图片视频属于表示层,当你登陆你的用户名查看聊天的时候这属于会话层,而你的tcp/udp则属于传输链层 ,ip属于网络层,mac地址属于数据链层,将数据转化成电信号发送则属于物理层

9.Tcp三次握手和四次挥手

  全是数学公式和英文看不懂,不要紧,我给你打个不恰当的比方,三次握手就相当于我们谈恋爱的开始过程首先小伙子看上了某家的黄花大闺女然后主动给人家表白姑娘呢也很情愿然后 小伙子就说咱们开始相处,这期间有三个过程一是小伙子示好,二是姑娘答应,三是小伙子确认情侣关系,这就是三次握手,其中服务段发出了两次请求客户端产生了一次响应

  那么四次挥手是怎么回事呢?也跟谈恋爱一样,两个人相处的时间长了吧就都感觉腻了,小伙子呢就对姑娘说咱么分手吧,小姑娘呢有特别的不得就先回了一句我知道了但是你让我先静一静整理一下情绪,然会过了一会想通了就给小伙子又回了,好的,那就拜拜,小伙子收到后呢就回了一句拜拜,这就结束了,那么在这个过程中服务端先请求了一次然后客户端响应了两次结果,之后服务端有请求了一次,最终断开了连接, 希望这个不是那么很恰当的列子能够帮助你更好的理解

三次握手

TCP是因特网中的传输层协议,使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方回答SYN+ACK[1],并最终对对方的 SYN 执行 ACK 确认。这种建立连接的方法可以防止产生错误的连接。[1] 
TCP三次握手的过程如下:
客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。
服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。
客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。
三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。

tcp的三次握手

 

四次挥手

建立一个连接需要三次握手,而终止一个连接要经过四次握手,这是由TCP的半关闭(half-close)造成的。
(1) 某个应用进程首先调用close,称该端执行“主动关闭”(active close)。该端的TCP于是发送一个FIN分节,表示数据发送完毕。
(2) 接收到这个FIN的对端执行 “被动关闭”(passive close),这个FIN由TCP确认。
注意:FIN的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程,放在已排队等候该应用进程接收的任何其他数据之后,因为,FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。
(3) 一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN。
(4) 接收这个最终FIN的原发送端TCP(即执行主动关闭的那一端)确认这个FIN。[1] 
既然每个方向都需要一个FIN和一个ACK,因此通常需要4个分节。
注意:
(1) “通常”是指,某些情况下,步骤1的FIN随数据一起发送,另外,步骤2和步骤3发送的分节都出自执行被动关闭那一端,有可能被合并成一个分节。[2] 
(2) 在步骤2与步骤3之间,从执行被动关闭一端到执行主动关闭一端流动数据是可能的,这称为“半关闭”(half-close)。
(3) 当一个Unix进程无论自愿地(调用exit或从main函数返回)还是非自愿地(收到一个终止本进程的信号)终止时,所有打开的描述符都被关闭,这也导致仍然打开的任何TCP连接上也发出一个FIN。
无论是客户还是服务器,任何一端都可以执行主动关闭。通常情况是,客户执行主动关闭,但是某些协议,例如,HTTP/1.0却由服务器执行主动关闭。[2] 

 

补充的一点就是:断开连接是,,反应到代码上就是抛出异常或者发送空的内容

一点温馨的提示,当网络的知识学到现在我相信你应该有所思考,大学的时候明明学了这些但是就是记不住也不知道哪里用,现在才后悔当时那会怎么没有好好的学是吧,记住一句话存在即合理

那么建议你在大学里必须要重视的几门课程,<计算机组成原理>,<网络编程>,<数据结构>,<算法>当然C语言就不用说了,所有开发语言的母语这你必须要会

 

网络编程的示例

--------------------------------服务端----------------------------------------
import socket   "不仅python 中有在C,C#,C++中也有
serve = socket.socket()
server.bind("1921.168.13.125",8001)  #这一步是进行绑定IP地址是自己的
server.listen(5)    #设置后面可以等待5个人
ret1 = server.accept()  #在这里会有阻塞,只要有人连接就建立通讯开始交换数据
print(ret1)     #这里面是有两个数据的1:conn是从客户端和服务端连接的对象  
                                 2:addr:是客户端的地址信息
conn.recv (1024)#"1024"表示服务端通过对象获取数据时 ,一次性最多传输1024个字节
conn.send (b'start') #服务端通过连接对象给客户端回复了一个消息

 

-----------------------------------------客户端----------------------------------
import socket

client = socket.socket()

# 客户端向服务端发起连接请求
# 阻塞,去连接,直到连接成功后才会继续向下走。
client.connect(('192.168.13.125',8000))


# # 链接上服务端后,向服务端发送消息
client.send(b'hello')


# 客户端等待服务端给他发送消息
data = client.recv(1024)
print(data)

# 关闭自己
client.close()

 这样只是进行了一次通讯传输完数据之后就关闭了,那么怎样实现连续的传输呢?

-------------------------------服务端---------------------------------------------
import socket

server = socket.socket()

server.bind(('192.168.13.155',8001))

server.listen(5)

while True:
    conn,addr = server.accept()
    # 字节类型
    while True:
        data = conn.recv(1024) # 阻塞
        if data == b'exit':
            break
        response = data + b' SB'
        conn.send(response)

    conn.close()

 

-----------------------------------客户端---------------------------------------
import socket

sk = socket.socket()

sk.connect(('192.168.13.155',8001))

while True:
    name = input("请输入姓名:")
    sk.send(name.encode('utf-8')) # 字节
    if name == 'exit':
        break

    response = sk.recv(1024) # 字节
    print(response.decode('utf-8'))

sk.close()

 这样就实现了基本通讯的功能

    

posted @ 2018-09-03 15:56  RootEvils  阅读(269)  评论(0编辑  收藏  举报