1.架构:

  C/S--客户端(client/服务端(server

  B/S--浏览器(browser/服务端(server

  软件C/S:浏览器,微信,QQ等与其对应的服务器

  硬件C/S:打印机--打印机作为客户端,电脑作为提供数据的服务器。

 2.网络通信的流程:

  1)电脑发起请求:这个请求直接就是IP地址,那么直接进入下一阶段,否则     

在本地DNS缓存中查找这个域名,并且解析出IP地址,如果本地缓存没有,那么就去把

域名发到交换机然后再上传到路由器,路由器在自己的缓存中查找一下,然后让DNS

务器把正确的IP返回来,这个时候路由器再把IP地址返回交换机,交换机再传递给发

送过来的电脑,电脑把域名和IP缓存下来,供下次使用。路由器也会保存域名和IP

供下次使用。

  2)交换机拿到电脑发过来的IP地址后,通过子网掩码计算出当前的IP地址段,如

果是在当前的地址段,就用广播把请求发给这个IP地址段内的所有电脑,相应的电脑

接到消息后,作出响应,再原路返回。(IP地址段,看的是前两个或者前三个是否一

样。在这个IP地址段内,叫做子网)

  3)如果交换机计算出,这个IP不在当前的IP地址段内,那么就把这个IP上交到

路由器,由路由器继续处理。路由器会查找保存在它上面的IP地址段,找到后把传上

来的IP传递给相应的交换机。

  4)如果路由器内找不到对应的IP地址段,那就计算出一个连接外网最优的路径

,把请求发送给对方的服务器。

  5)对方服务器接到请求后,处理完毕,会再按照原路返回给电脑。

  6)软件在发出请求时,电脑会自动分配一个端口号给这个软件。返回来的数据

会根据端口号把数据传递给对应的软件。软件再把数据展示出来即可。

 

3.设备

  1)集线器(物理层):最原始的,把多台电脑连接起来的设备。可以形成一个局域网。

     集线器的英文称为Hub”。“Hub”是“中心”的意思,集线器的主要功能是对

接收到的信号进行再生整形放大,以扩大网络的传输距离,同时把所有节点集中在以

它为中心的节点上。它工作于OSI(开放系统互联参考模型)参考模型第一层,即“物理

”。集线器与网卡、网线等传输介质一样,属于局域网中的基础设备,采用CSMA/CD

(即带冲突检测的载波监听多路访问技术)介质访问控制机制。集线器每个接口简单的

收发比特,收到1就转发1,收到0就转发0,不进行碰撞检测。

集线器(hub)属于纯硬件网络底层设备,基本上不具有类似于交换机的"智能记忆"

力和"学习"能力。它也不具备交换机所具有的MAC地址表,所以它发送数据时都是没有

针对性的,而是采用广播方式发送。也就是说当它要向某节点发送数据时,不是直接

把数据发送到目的节点,而是把数据包发送到与集线器相连的所有节点,如图所示,

简单明了。

HUB是一个多端口的转发器,当以HUB为中心设备时,网络中某条线路产生了故障,并不影响其它线路的工作。所以HUB在局域网中得到了广泛的应用。大多数的时候它用在

星型与树型网络拓扑结构中,以RJ45接口与各主机相连(也有BNC接口),HUB按照不

同的说法有很多种类。

 

  2)交换机(属于数据链路层):连接多台电脑的设备。(交换机工作于OSI参考模型的第二层,即数据链路层。交换机内部的CPU会在每个端口成功连接时,通过将MAC地址和端口对应,形成一张MAC表。在今后的通讯中,发往该MAC地址的数据包将仅送往其对应的端口,而不是所有的端口。因此,交换机可用于划分数据链路层广播,即冲突域;但它不能划分网络层广播,即广播域。)

   交换机拥有一条很高带宽的背部总线和内部交换矩阵。交换机的所有的端口都挂接

在这条背部总线上,控制电路收到数据包以后,处理端口会查找内存中的地址对照表

以确定目的MAC(网卡的硬件地址)的NIC(网卡)挂接在哪个端口上,通过内部交换

矩阵迅速将数据包传送到目的端口,目的MAC若不存在,广播到所有的端口,接收端口

回应后交换机会“学习”新的MAC地址,并把它添加入内部MAC地址表中。使用交换机

也可以把网络“分段”,通过对照IP地址表,交换机只允许必要的网络流量通过交换

机。通过交换机的过滤和转发,可以有效的减少冲突域,但它不能划分网络层广播,

即广播域。

端口

交换机在同一时刻可进行多个端口对之间的数据传输。每一端口都可视为独立的物理

网段(注:非IP网段),连接在其上的网络设备独自享有全部的带宽,无须同其他设

备竞争使用。当节点A向节点D发送数据时,节点B可同时向节点C发送数据,而且这两

个传输都享有网络的全部带宽,都有着自己的虚拟连接。假使这里使用的是10Mbps

以太网交换机,那么该交换机这时的总流通量就等于2×10Mbps=20Mbps,而使用

10Mbps的共享式HUB时,一个HUB的总流通量也不会超出10Mbps。总之,交换机是一种

基于MAC地址识别,能完成封装转发数据帧功能的网络设备。交换机可以“学习”MAC

地址,并把其存放在内部地址表中,通过在数据帧的始发者和目标接收者之间建立临

时的交换路径,使数据帧直接由源地址到达目的地址。

传输

交换机的传输模式有全双工,半双工,全双工/半双工自适应交换机的全双工是指交换机在发送数据的同时也能够接收数据,两者同步进行,这好像我们平时打电话一样,说话的同时也能够听到对方的声音。交换机都支持全双工。全双工的好处在于迟延小,速度快。

提到全双工,就不能不提与之密切对应的另一个概念,那就是“半双工”,所谓半双

工就是指一个时间段内只有一个动作发生,举个简单例子,一条窄窄的马路,同时只

能有一辆车通过,当有两辆车对开,这种情况下就只能一辆先过,等到头儿后另一辆

再开,这个例子就形象的说明了半双工的原理。早期的对讲机、以及早期集线器等设

备都是实行半双工的产品。随着技术的不断进步,半双工会逐渐退出历史舞台。

(3)网卡(数据链路层):

网卡是工作在链路层的网络组件,是局域网中连接计算机和传输介质的接口,不仅能实现与局域网传输介质之间的物理连接和电信号匹配,还涉及帧的发送与接收、帧的封装与拆封、介质访问控制、数据的编码与解码以及数据缓存的功能等。

网卡上面装有处理器存储器(包括RAMROM)。网卡局域网之间的通信是通过电缆双绞线以串行传输方式进行的。而网卡和计算机之间的通信则是通过计算机主板上的I/O总线以并行传输方式进行。因此,网卡的一个重要功能就是要进行串行/并行转换。由于网络上的数据率和计算机总线上的数据率并不相同,因此在网卡中必须装有对数据进行缓存的存储芯片

安装网卡时必须将管理网卡的设备驱动程序安装在计算机的操作系统中。这个驱动程序以后就会告诉网卡,应当从存储器的什么位置上将局域网传送过来的数据块存储下来。网卡还要能够实现以太网协议。

网卡并不是独立的自治单元,因为网卡本身不带电源而是必须使用所插入的计算机的电源,并受该计算机的控制。因此网卡可看成为一个半自治的单元。当网卡收到一个有差错的帧时,它就将这个帧丢弃而不必通知它所插入的计算机。当网卡收到一个正确的帧时,它就使用中断来通知该计算机并交付给协议栈中的网络层。当计算机要发送一个IP数据包时,它就由协议栈向下交给网卡组装成帧后发送到局域网

随着集成度的不断提高,网卡上的芯片的个数不断的减少,虽然各个厂家生产的网卡种类繁多,但其功能大同小异 

网卡主要功能:

1、数据的封装与解封

发送时将上一层交下来的数据加上首部和尾部,成为以太网的。接收时将以太网的帧剥去首部和尾部,然后送交上一层

2、链路管理

主要是CSMA/CDCarrier Sense Multiple Access with Collision Detection ,带冲突检测载波监听多路访问)协议的实现

3编码译码

曼彻斯特编码译码

(4)MAC地址

24位是由厂家自己分配的,称为扩展标识符。同一个厂家生产的网卡中MAC地址后24位是不同的。

MAC地址对应于OSI参考模型的第二层数据链路层,工作在数据链路层的交换机维护着计算机MAC地址和自身端口的数据库,交换机根据收到的数据帧中的目的MAC地址字段来转发数据帧。

4.协议

(1) 子网掩码

子网掩码:计算是否属于同一网段或同一子网, 255.255.255.0

目标ip地址是:

目标IP:    192.168.12.16

  转换后:    11000000.10101000.00001100.00010000

  子网掩码:255.255.255.0

  转换后:    11111111.11111111.11111111.00000000

  与运算结果:11000000.10101000.00001100.00000000

 转为十进制结果:192.168.12.0  

(2) DHCP

  DHCPDynamic Host Configuration Protocol,动态主机配置协议)通常被应用在大型的局域网络环境中,主要作用是集中的管理、分配IP地址,使网络环境中的主机动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。

(3)ARP

地址解析协议,即ARPAddress Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。

(4) 域名

域名(英语:Domain Name),简称域名、网域,是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

(5) DNS服务器

DNSDomain Name Server,域名服务器)是进行域名(domain name)和与之相对应的IP地址 (IP address)转换的服务器。DNS中保存了一张域名(domain name)和与之相对应的IP地址 (IP address)的表,以解析消息的域名。

(6) 端口

TCP端口和UDP端口。由于TCPUDP 两个协议是独立的,因此各自的端口号也相互独立,比如TCP235端口,UDP也 可以有235端口,两者并不冲突

周知端口是众所周知的端口号,范围从01023,其中80端口分配给WWW服务,21端口分配给FTP服务等。

动态端口的范围是从4915265535。之所以称为动态端口,是因为它 一般不固定分配某种服务,而是动态分配。

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

总结:每个端口对应一个应用软件(进程)。

(7) NAT

NAT不仅能解决了IP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。

1.宽带分享:这是 NAT 主机的最大功能。

2.安全防护:NAT 之内的 PC 联机到 Internet 上面时,他所显示的 IP NAT 主机的公共 IP,所以 Client 端的 PC 当然就具有一定程度的安全了,外界在进行 portscan(端口扫描) 的时候,就侦测不到源Client 端的 PC

8)网关

 网关(Gateway)又称网间连接器、协议转换器。默认网关在网络层上以实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。网关的结构也和路由器类似,不同的是互连层。网关既可以用于广域网互连,也可以用于局域网互连 [1]  

【说明:由于历史的原因,许多有关TCP/IP的文献曾经把网络层使用的路由器称为网关,在今天很多局域网采用都是路由来接入网络,因此通常指的网关就是路由器的IP!】

如下图所示网关作用:

                                                                     

(7) 路由协议

路由协议通过在路由器之间共享路由信息来支持可路由协议。路由信息在相邻路由器之间传递,确保所有路由器知道到其它路由器的路径。总之,路由协议创建了路由表,描述了网络拓扑结构;路由协议与路由器协同工作,执行路由选择和数据包转发功能。

 5.TCP,UDP

在每层添加一些数据头,如图所示:

                                                                   

1TCPUDP对比

TCPTransmission Control Protocol)可靠的、面向连接的协议(eg:打电话)、传输效率低全双工通信(发送缓存&接收缓存)、面向字节流。使用TCP的应用:Web浏览器;文件传输程序。

UDPUser Datagram Protocol)不可靠的、无连接的服务,传输效率高(发送前时延小),一对一、一对多、多对一、多对多、面向报文(数据包),尽最大努力服务,无拥塞控制。使用UDP的应用:域名系统 (DNS);视频流;IP语音(VoIP)

下图展示两者的区别:

                                                   

(2)tcp三次握手,四次挥手

A.三次握手

                                         

(a)客户端要请求网络数据,所以要跟服务端建立通道,会带着一些参数传递到服务端。

(b)服务端接到,客户端传递过来的请求后,要告诉一下客户端,让客户端知道,我已接到你的请求。客户端接到了,服务端传递过来的消息,知道服务端已经接收到自己传递过去的请求。

(c)客户端还要告诉一下服务端,让服务端知道,你给我的回信我收到了,接下来,咱俩就开始传输数据吧。   

详细流程:

(a)TCP服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了LISTEN(监听)状态;

(b)TCP客户进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文,这是报文首部中的同部位SYN=1,同时选择一个初始序列号 seq=x ,此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。

(c)TCP服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该 ACK=1SYN=1,确认号是ack=x+1,同时也要为自己初始化一个序列号 seq=y,此时,TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据,但是同样要消耗一个序号。

(d)TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1ack=y+1,自己的序列号seq=x+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。

(e)当服务器收到客户端的确认后也进入ESTABLISHED状态,此后双方就可以开始通信了。

 B.四次挥手

                                               

(a) 客户端想要断开连接,所以发送一个消息给服务端。

(b) 服务端收到消息后,会给客户端发送一个消息,告诉客户端,稍等我这里处理一下数据。

(c) 服务端处理完数据后,会再次给客户端发送一个消息,告诉客户端,我处理完了。

(d) 客户端收到服务端第二次发来的数据处理完毕的消息后,会发送一个消息给服务端,告诉服务端你的消息我收到了,现在可以断开连接了。这样客户端和服务端就都断开了。

详细流程:

数据传输完毕后,双方都可释放连接。最开始的时候,客户端和服务器都是处于ESTABLISHED状态,然后客户端主动关闭,服务器被动关闭。服务端也可以主动关闭,一个流程。

(a)客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。

(b)服务器收到连接释放报文,发出确认报文,ACK=1ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。

(c)客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。

(d)服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。

(e)客户端收到服务器的连接释放报文后,必须发出确认,ACK=1ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。

(f)服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

 6.socket

(1)套接字socket的发展史及分类

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

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

套接字家族的名字:AF_UNIX

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

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

套接字家族的名字:AF_INET

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

(2)socketosi中的位置

                   

 

UNIX BSD就发明了socket这种东西,socket屏蔽了各个协议的通信细节,使得程序员无需关注协议本身,直接使用socket提供的接口来进行互联的不同主机间的进程的通信。这就好比操作系统给我们提供了使用底层硬件功能的系统调用,通过系统调用我们可以方便的使用磁盘(文件操作),使用内存,而无需自己去进行磁盘读写,内存管理。socket其实也是一样的东西,就是提供了tcp/ip协议的抽象,对外提供了一套接口,过这个接口就可以统一、方便的使用tcp/ip协议的功能了。

 

(3)TCPUDPsocket差异对比图:

 

(4)缓冲区

每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区。

write()/send() 并不立即向网络中传输数据,而是先将数据写入缓冲区中,再由TCP协议将数据从缓冲区发送到目标机器。一旦将数据写入到缓冲区,函数就可以成功返回,不管它们有没有到达目标机器,也不管它们何时被发送到网络,这些都是TCP协议负责的事情。

TCP协议独立于 write()/send() 函数,数据有可能刚被写入缓冲区就发送到网络,也可能在缓冲区中不断积压,多次写入的数据被一次性发送到网络,这取决于当时的网络情况、当前线程是否空闲等诸多因素,不由程序员控制。

read()/recv() 函数也是如此,也从输入缓冲区中读取数据,而不是直接从网络中读取。

这些I/O缓冲区特性可整理如下:

  1. I/O缓冲区在每个TCP套接字中单独存在;
  2. I/O缓冲区在创建套接字时自动生成;
  3. 即使关闭套接字也会继续传送输出缓冲区中遗留的数据;
  4. 关闭套接字将丢失输入缓冲区中的数据。

 

输入输出缓冲区的默认大小一般都是 8K,可以通过 getsockopt() 函数获取:

unsigned optVal;

int optLen = sizeof(int);

getsockopt(servSock, SOL_SOCKET, SO_SNDBUF,(char*)&optVal, &optLen);

printf("Buffer length: %d\n", optVal);

 

7.subprocess

  Python中这是一个模块,可以使用这个模块,执行一些Linux里的命令。

 

sub_obj = subprocess.Popen(
    'Linux命令',#例如:dir,ipconfig -all等
    shell=True,
    stdout=subprocess.PIPE,  #正确结果的存放位置
    stderr=subprocess.PIPE   #错误结果的存放位置
)

 

8.黏包

两种黏包现象:

1 连续的小包可能会被优化算法组合到一起进行发送

2 第一次如果发送的数据大小2000B接收端一次性接受大小为1024,这就导致剩下的内容会被下一次recv接收到,导致结果错乱

 

方案一:由于双方不知道对方发送数据的长度,导致接收的时候,可能接收不全,或者多接收另外一次发送的信息内容,所以在发送真实数据之前,要先发送数据的长度,接收端根据长度来接收后面的真实数据,但是双方有一个交互确认的过程

 

方案二:

Struct模块,

打包:struct.pack(‘i’,长度)

解包:struct.unpack(‘i’,字节)

把数据长度变成四个字节,然后放到需要传输的数据前面,接收方收到数据后,先获取需要接收的数据的长度,然后把长度设置给socket.recv(长度),这样接收容器就可以和需要接受的数据一样大了。

 

9.几个数字

(1)而以太网数据包的数据部分,最长只有1500字节。因此,如果IP数据包超过了1500字节,它就需要分割成几个以太网数据包,分开发送了。

(2)输入输出缓冲区的默认大小一般都是 8KB

(3) socket.recv(int数值)