网络通讯概述

 

上图也可简化为下图

 

另外一种分层模式

 

 

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

 

1、网络通信过程

    (1)在浏览器中输入一个网址时,需要将它先解析出ip地址来;

    (2)当得到ip地址之后,浏览器以tcp的方式3次握手链接服务器;

    (3)客户端以tcp的方式发送http协议的请求数据给服务器;

    (4)服务器以tcp的方式回应http协议的应答数据给浏览器。

 

2、MAC地址:在设备与设备之间数据通信时用来标记收发双方(网卡的序列号);

 

3、IP地址:在逻辑上标记一台电脑,用来指引数据包的收发方向(相当于电脑的序列号);

4、网络掩码:用来区分ip地址的网络号和主机号;

5、默认网关:当需要发送的数据包的目的ip不在本网段内时,就会发送给默认的一台电脑,成为网关;

6、集线器:已过时,用来连接多态电脑,缺点:每次收发数据都进行广播,网络会变的拥堵;

7、交换机:集线器的升级版,有学习功能知道需要发送给哪台设备,根据需要进行单播、广播;

8、路由器:连接多个不同的网段,让他们之间可以进行收发数据,每次收到数据后,ip不变,但是MAC地址会变化;

9、DNS:用来解析出IP(类似电话簿);

10、http服务器:提供浏览器能够访问到的数据。

 

链路层:

          ARP : 根据ip获取mac 地址

         RARP : 根据mac 地址ip获取

 

网络层:

      ICMP: 用于ping 指令

 

 

用一个简单的例子来描述下网络请求的过程,ping 一个外网地址(ip 192.168.2.1)

 

 

 

第一步: 获取默认网关地址(输入 ping 192.168.2.1 后, 客户端发送了一个arp 广播, 默认网关收到广播后把自己地址返回给客户端, 客户端收到默认网关地址后, 发送请求
 

 

 

 

第二步:默认网关收到数据包后, 接着发送到下一个路由器

 

 

第三步:第二个路由接收到数据包后, 接着发送到下一个路由器,直到找到目标IP

 

 

需要注意的是,在从A到B网络ping通前,

1,需要先配置计算机的网关为路由器与自己连接最近的ip,

2,路由器需要将左右两侧网卡分别配置好对应网段的转发协议 (对于两个路由器间的通讯)

3,比较需要注意的是路由器的发送和返回时都应该配置好协议,以供来回网络通路

4,A ping F 通过C路由器时,A通过ARP获得到的C的mac地址将数据传递给C,由C继续向下传递 过程与A 传递给 C相同 也就是说,A的 目的ip 是G,但是A的 目的mac 是最近的C路由器 每次传递过程中,目的ip不变,目的mac在进过不同的ip时会发生更新

 

总结: 每一块网卡只有一个惟一的mac地址,mac地址共6个字节,前三个表示供应商,后三个标识序列号 路由器的作用是连接两个不同的网段 如 192.168.1.x 和 192.168.2.x 使得他们之间可以通讯 这是因为路由器相当于有两块网卡,有两个mac地址,可以分别接入两个网段,然后通过自身内部数据传递, 从而完成两个网段之间的通信 在A ping G的单向过程中,mac地址随着在两个设备传递数据发生改变,即传递到第二个设备时 第二个设备的dest MAC 即目标MAC会变成第三个设备的mac地址,第二个设备的src MAC 就变成第一个设备的右ip的mac地址 在此过程中,各设备的desc ip即目标ip不变,即G电脑的ip 整个过程在数据到达G 开始返回时 改变,过程与发起请求时(A --> G 时)相同

----------------------------------------

ip:标记设备的逻辑地址,

mac:标记设备的实际地址,用于数据转发时相邻的通讯

netmask(子网掩码):与ip相逻辑 与,共同确定所在网段

gateway(网关):当发送的ip不在同一个网段内时,将这个数据通过网关发送出去

 

 

再按一个例子 :在浏览器中访问百度的过程

 

在A电脑 地址栏输入www.baidu.com 假如A本地没有网关,访问失败

1,要解析出baidu.com的对应ip地址,过程如下

1,先知道默认网关的mac,

            1,使用arp协议,获得默认网关的mac地址,

            2,返回mac地址给访问发起者A

                2,组织数据发送给默认网关(目标ip为A的dns服务器,但是mac地址是默认网关的mac地址,此后 各设备之间目的ip不变,目标 mac在每次数据传递时发生更新,更新为下一个要连接的设备mac)

            3,默认网关拥有转发数据的能力,将数据转发给路由器

            4,路由器根据自己的路由协议,选择一条最合适的较快路径,转发数据给目的网关(此时相当于到达了dns服务器的网关路由器)

            5,目的网关(dns服务器所在网关)将数据转发给dns服务器,

            6,请求到达了DNS服务器,Dns服务器解析出baidu.com对应的ip地址后,原路返回ip给A电脑(通过dns服务器网关,目的ip为A电脑 ip地址,目标mac为网关的mac,但目的mac在每次数据传递后发生更新,更新为下一个要连接的设备mac)

            7,返回到A电脑,A获取得到baidu,com对应的ip地址

2,得到了baidu.com的ip地址后,会发送tcp的三次握手,建立起连接(细节和前面相同)

3,使用http协议发送请求数据给web服务器,

4,web服务收到数据请求之后,通过查询自己的服务器得到相应的结果,原路返回给浏览器

5,浏览器接收到数据后,通过浏览器自己的渲染功能来显示这个网页

6,浏览器关闭Tcp连接。即4次挥手 整个访问过程完成

 

总结一下流程

 

 

传输层 

 1: tcp 传输控制协议

    1.1 稳定
    1.2 相对于udp 稍慢
    1.3 安全,不容易丢包

   1.2 通讯图

tcp服务器

  1. socket创建一个套接字
  2. bind绑定ip和port
  3. listen使套接字变为可以被动链接
  4. accept等待客户端的链接
  5. recv/send接收发送数据

tcp客户端

tcp客户端,并不是像之前一个段子:一个顾客去饭馆吃饭,这个顾客要点菜,就问服务员咱们饭店有客户端么,然后这个服务员非常客气的说道:先生 我们饭店不用客户端,我们直接送到您的餐桌上

如果,不学习网络的知识是不是 说不定也会发生那样的笑话 ,哈哈

所谓的服务器端:就是提供服务的一方,而客户端,就是需要被服务的一方

# 创建socket
tcpClientSocket = socket(AF_INET, SOCK_STREAM)

# 链接服务器
serAddr = ('192.168.1.102', 7788)
tcpClientSocket.connect(serAddr)

# 提示用户输入数据
sendData = raw_input("请输入要发送的数据:")

tcpClientSocket.send(sendData)

# 接收对方发送过来的数据,最大接收1024个字节
recvData = tcpClientSocket.recv(1024)
print '接收到的数据为:',recvData

# 关闭套接字
tcpClientSocket.close()

 

tcp 的三次握手

 

第一次握手

 

 

第二次

第三次

 

 

 

 

 

 

 

 

三次握手过程:

         发起请求: 由客户端发起请求,请求会携带一个syn的值到服务器,

         响应请求: 服务器在接受请求和携带的值后会返回该值并且新增一个名为ack(确认码)的值,

         确认响应: 当服务器返回的值被客户端接受后,客户端将返回的ack确认码加一后再次请求服务器,若请求接通到达服务器                 则 表明tcp连接已经建立(在确认响应的信号发出后,往往会直接在后边跟随一个数据请求,当确认响应的信号被服务器接收后, 后边跟随的数据请求包也能紧接着迅速到达服务器,然后服务器会先返回这次请求的ack码。再把请求要的内容返回, 请求内容返回后,也先返回给服务器一个ack码,再发起下一次的数据请求,如此循环。。。 也就是说,ack确认码包总是先于响应数据包发出,不论客户端服务器) 此后便可开始客户端与服务器的数据交互,需要注意的是:在tcp中,如果有一方接受了另一方的数据, 一定会返回ack确认码给发送方 以表示收到信息 而在UDP中没有这个过程,这就导致了tcp稳定,而udp不稳定 断开连

 

接四次挥手过程:

        在断开连接前,假设服务端和客户端以套接字的方式连通,此时双方都有一个socket用以连接 发起方发起请求(我要断开了):

        客户端断开连接。即socket.close(),然后会发送fin和ack码给服务端, 回应方回应请求(我知道了):

        服务端接到fin码后回应给客户端一个ack确认码 回应方发起请求(我也要断开了):

        服务端此时也要断开对应套接字的连接。socket.close() ,同样的,服务端也会发送一个seq给客户端 发起方回应请求(好的,断开吧):

        在接收到服务器端断开连接的请求后,返回一个ack确认码,至此连接完全断开

 

tcp长连接和短连接

TCP在真正的读写操作之前,server与client之间必须建立一个连接,

当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,

连接的建立通过三次握手,释放则需要四次握手,

所以说每个连接的建立都是需要资源消耗和时间消耗的。

TCP通信的整个过程,如下图:

1. TCP短连接

模拟一种TCP短连接的情况:

  1. client 向 server 发起连接请求
  2. server 接到请求,双方建立连接
  3. client 向 server 发送消息
  4. server 回应 client
  5. 一次读写完成,此时双方任何一个都可以发起 close 操作

在第 步骤5中,一般都是 client 先发起 close 操作。当然也不排除有特殊的情况。

从上面的描述看,短连接一般只会在 client/server 间传递一次读写操作!

2. TCP长连接

再模拟一种长连接的情况:

  1. client 向 server 发起连接
  2. server 接到请求,双方建立连接
  3. client 向 server 发送消息
  4. server 回应 client
  5. 一次读写完成,连接不关闭
  6. 后续读写操作...
  7. 长时间操作之后client发起关闭请求

3. TCP长/短连接操作过程

3.1 短连接的操作步骤是:

建立连接——数据传输——关闭连接...建立连接——数据传输——关闭连接

3.2 长连接的操作步骤是:

建立连接——数据传输...(保持连接)...数据传输——关闭连接

4. TCP长/短连接的优点和缺点

  • 长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。

    对于频繁请求资源的客户来说,较适用长连接。

  • client与server之间的连接如果一直不关闭的话,会存在一个问题,

    随着客户端连接越来越多,server早晚有扛不住的时候,这时候server端需要采取一些策略,

    如关闭一些长时间没有读写事件发生的连接,这样可以避免一些恶意连接导致server端服务受损;

    如果条件再允许就可以以客户端机器为颗粒度,限制每个客户端的最大长连接数,

    这样可以完全避免某个蛋疼的客户端连累后端服务。

  • 短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。
  • 但如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽。

5. TCP长/短连接的应用场景

  • 长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。

    每个TCP连接都需要三次握手,这需要时间,如果每个操作都是先连接,

    再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,

    再次处理时直接发送数据包就OK了,不用建立TCP连接。

    例如:数据库的连接用长连接,如果用短连接频繁的通信会造成socket错误,

    而且频繁的socket 创建也是对资源的浪费。

  • 而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,

    而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,

    如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,

    那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。


    

UDP介绍

UDP --- 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。

UDP是一种面向无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。

UDP特点:

UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。 UDP传输数据时有大小限制,每个被传输的数据报必须限定在64KB之内。 UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。

【适用情况】

UDP是面向消息的协议,通信时不需要建立连接,数据的传输自然是不可靠的,UDP一般用于多点通信和实时的数据业务,比如

  • 语音广播
  • 视频
  • QQ
  • TFTP(简单文件传送)
  • SNMP(简单网络管理协议)
  • RIP(路由信息协议,如报告股票市场,航空信息)
  • DNS(域名解释)

注重速度流畅

UDP操作简单,而且仅需要较少的监护,因此通常用于局域网高可靠性的分散系统中client/server应用程序。例如视频会议系统,并不要求音频视频数据绝对的正确,只要保证连贯性就可以了,这种情况下显然使用UDP会更合理一些。

udp网络程序-发送数据

创建一个udp客户端程序的流程是简单,具体步骤如下:

  1. 创建客户端套接字
  2. 发送/接收数据
  3. 关闭套接字

 

 

udp总结

1. udp是TCP/IP协议族中的一种协议能够完成不同机器上的程序间的数据通信

2. udp服务器、客户端

  • udp的服务器和客户端的区分:往往是通过请求服务提供服务来进行区分
  • 请求服务的一方称为:客户端
  • 提供服务的一方称为:服务器

3. udp绑定问题

  • 一般情况下,服务器端,需要绑定端口,目的是为了让其他的客户端能够正确发送到此进程
  • 客户端,一般不需要绑定,而是让操作系统随机分配,这样就不会因为需要绑定的端口被占用而导致程序无法运行的情况

 

 

 

 

 

 

 

 

 


版权声明:本文为investzhu原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。