网络编程套接字之预备知识

目录

预备知识:

一、源IP地址和目的IP地址

二、源MAC地址和目的MAC地址

三、端口号与SCOKET

四、区分TCP与UDP协议

预备知识:

前言:IP 和 MAC 都是地址,都用来标识连接到网络中的计算机,看起来是两种类似的技术,这让读者感到非常困惑,搞不清它们之间的区别,更不理解“为什么一台计算机需要两个地址

一、源IP地址和目的IP地址

一台计算机使用的 IP 地址,是由 ISP(指提供 Internet 服务的公司,比如电信、网通、移动等)负责分配的。通常情况下,计算机每次连接网络使用的 IP 地址都是不固定的,换句话说,ISP 会动态分配一个 IP 地址给它。

一台计算机可以拥有一个独立的 IP 地址,一个局域网也可以拥有一个独立的 IP 地址(对外就好像只有一台计算机)。

对于目前广泛使用 IPv4 地址,它的资源是非常有限的,一台计算机一个 IP 地址是不现实的,往往一个局域网才拥有一个 IP 地址。

IP地址是32位二进制数,在数据传输的过程中,需要涵盖源IP地址和目的IP地址。

在数据进行传输之前,会先自顶向下贯穿网络协议栈完成数据的封装,其中在网络层封装的IP报头当中就涵盖了源IP地址和目的IP地址。

二、源MAC地址和目的MAC地址

通常情况下,一个局域网才能拥有一个独立的 IP,换句话说,IP 地址只能定位到一个局域网,无法定位到具体的某个设备。这可怎么办呀?这样也没法通信啊,这就引入了MAC地址这个概念。

MAC地址48位二进制数,直译为媒体存取控制位址,也称为局域网地址,以太网地址物理地址。它是一个用来确认网络设备位置的位址。

局域网中的路由器/交换机会记录每台计算机的 MAC 地址。当一台计算机通过网络向另一台计算机发送数据时,数据包中除了会附带对方的 IP 地址,还会附带对方的 MAC 地址

当数据包达到局域网以后,路由器/交换机会根据数据包中的 MAC 地址 找到对应的计算机,然后把数据包转交给它,这样就完成了数据的传递。

源MAC地址和目的MAC地址都存储在数据链路层的帧头中。

其实,真正能唯一标识设备的是 MAC 地址,MAC地址用于在网络中唯一标示一个网卡(计算机出厂的时候,MAC地址已经被写死在网卡上了),一台设备若有一或多个网卡,则每个网卡都需要并会有一个唯一的MAC地址 (形象地说,MAC地址就如同身份证上的身份证号码,具有唯一性)。

 相信大家读到这,可能想问,IP地址和MAC地址有什么区别吧?

大致如下:

  1. 对于网络上的某一设备,如一台计算机或一台路由器,其IP地址是基于网络括扑设计出的,同一台设备或计算机上,改动IP地址是很容易的(但必须唯一),而MAC则是生产厂商烧录好的,一般不能改动。我们可以根据需要给一台主机指定任意的IP地址,如我们可以给局域网上的某台计算机分配IP地址为192.168.0.192 ,也可以将它改成192.168.0.230。而任一网络设备(如网卡,路由器)一旦生产出来以后,其MAC地址不可由本地连接内的配置进行修改。如果一个计算机的网卡坏了,在更换网卡之后,该计算机的MAC地址就变了
  2. 长度不同。IP地址为32位,MAC地址为48位.
  3. 分配依据不同。IP地址的分配是基于网络拓扑,MAC地址的分配是基于制造商
  4. 寻址协议层不同。IP地址应用于OSI第三层,即网络层,而MAC地址应用在OSI第二层,即数据链路层。 数据链路层协议可以使数据从一个节点传递到相同链路的另一个节点上(通过MAC地址),而网络层协议使数据可以从一个网络传递到另一个网络上。

总结:

  • IP 地址和 MAC 地址虽然都是“地址”,但它们并不相同,在网络通信中发挥的作用也不一样。总的来说,IP 地址解决的是数据在外网(因特网、互联网)的传输问题,MAC 地址解决的是数据在内网(局域网)中的传输问题。
  • 对于一台计算机来说,MAC 地址是必须有的,IP 地址可有可无。如果两台通信的计算机处于同一个局域网,那么理论上只凭借 MAC 地址就可以找到对方;如果两台计算机跨网传输数据,那么 IP 地址和 MAC 地址缺一不可。

三、端口号与SCOKET

所谓的端口,就好像是门牌号一样,客户端可以通过ip地址找到对应的服务器端,但是服务器端是有很多端口的,简单来说,端口号(port)实际就是标识一台主机上的一个进程。

ps:一个进程可以绑定多个端口号,但是一个端口号只能对应一个进程。

通过类似门牌号的端口号,客户端才能真正的访问到该服务器,也就是说,两台主机之间通信的目的不仅仅是为了将数据发送给对端主机,而是为了访问对端主机上的某个服务。

比如我们在用搜狗搜索引擎进行搜索时,不仅仅是想将我们的请求发送给对端服务器,而是想访问对端服务器上部署的搜狗相关的搜索服务。

更何况实际生活中,两台主机之间,可能会存在多个正在进行跨网络通信的进程,这就更需要端口号来区分各个进程。

为了对端口进行区分,将每个端口进行了编号,这就是端口号。

TCP与UDP段结构中端口地址都是16位整数,范围为0---65535。

一般情况下,我们可以随意使用1024-65535中的任意端口,小于1024的已经被著名的应用程序给占用了。

socket通信(套接字):

本质上就是两个进程之间在进行通信,只不过这里是跨网络的进程间通信。比如刷b站和逛京东的行为,实际上是手机上的进程在和对端服务器主机上的进程之间在进行通信。

因此进程间通信的方式除了管道、消息队列、信号量、共享内存等方式外,还有套接字只不过前者是不跨网络的,而后者是跨网络的。

ps:因为端口号是隶属于某台主机的,所以端口号可以在两台不同的主机当中重复,但是在同一台主机上进行网络通信的进程的端口号不能重复。

可能有些人会想到进程ID(PID)和端口号(port)都是用来表示进程的,为何不用PID代替port呢?

这是因为两者不隶属于一个系统,前者是系统级的,后者则是网络的概念,打个比方,我们每个人都有身份证,身份证上的号码是唯一的,那么为什么我们还需要有学号,工号,之类的呢?那是因为身份证是政府所给的,学号工号等是学校,工作单位所给予的。两者的适用范围不同,况且并不是所有人都属于这个学校,这个单位。

PID和PORT也是如此,为什么不用PID代替PORT,因为并不是每个进程都需要进行网络间通信。

补充:

底层是如何实现PORT对应一个进程的?

实际底层采用哈希的方式建立了端口号和进程PID或PCB之间的映射关系,当底层拿到端口号时就可以直接执行对应的哈希算法,然后就能够找到该端口号对应的进程。

四、区分TCP与UDP协议

我们知道使用一台主机向对端主机发送数据的时候,数据是从应用层开始封装的(详细过程可参考博主的另一篇博客——初识计算机网络),一直到物理层才完成发送.....另一端主机拿到数据后开始分用操作.那么数据是怎么从应用层将数据传给传输层的呢?

操作系统提供了一组API即socket,用来实现将应用层交给传输层(内核)的操作。

常见的传输层协议就是我们这里需要讲的 TCP 与 UDP 协议。

它们的特性如下:

TCP协议UDP协议
需要建立连接无需建立连接
数据可靠传输

数据不可靠传输

面向字节流面向数据报(以数据报为基本单位)
全双工全双工

解读:

TCP协议即;传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

TCP协议需要建立连接的主要体现于:在数据传输之前,需要先建立连接,连接成功之后才可以进行传输(就好比打电话一样(非电话留言),需要对方接通,才可以进行消息的传递。)

面向字节流:可以简单的理解为,传输数据是基于IO流,流式数据的特征就是在IO流没有关闭的情
况下,是无边界的数据,可以多次发送,也可以分开多次接收。

面向数据报:可以简单的理解为,传输数据是一块一块的,发送一块数据假如100个字节,必须一次发送,接收也必须一次接收100个字节,而不能分100次,每次接收1个字节。

全双工:全双工通信又称为双向同时通信,即通信的双方可以同时发送和接收信息的信息交互方式。

TCP协议的可靠性体现在:TCP提供一种面向连接的、可靠的字节流服务。面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据包之前必须先建立一个TCP连接。这一过程与打电话很相似,先拨号振铃,等待对方摘机说“喂”,然后才说明是谁。在一个TCP连接中,仅有两方进行彼此通信。广播和多播不能用于TCP。

可能很多人会问TCP协议在传输数据的时候那么可靠,那么为什么需要UDP协议的存在呢?

我们先来看看两者的区别:

TCP 是面向连接的传输控制协议,而UDP 提供了无连接的数据报服务;TCP 具有高可靠性,确保传输数据的正确性,不出现丢失或乱序;UDP 在传输数据前不建立连接,不对数据报进行检查与修改,无须等待对方的应答,所以会出现分组丢失、重复、乱序,应用程序需要负责传输可靠性方面的所有工作;

UDP 具有较好的实时性,工作效率较 TCP 协议高;UDP 段结构比 TCP 的段结构简单,因此网络开销也小。TCP 协议可以保证接收端毫无差错地接收到发送端发出的字节流,为应用程序提供可靠的通信服务。对可靠性要求高的通信系统往往使用 TCP 传输数据。比如 HTTP 运用 TCP 进行数据的传输。

总结:

我们可以看出,虽然TCP协议传输的过程对信息的“保护”很好(面向连接),但这也意味着其底层需要做更多的工作,我们不能仅仅看见TCP协议“可靠”传输这一特点,我们也要看见其缺点。

同样,UDP虽然是一种不可靠传输协议(无需建立连接,传输速度快),但是底层实现相对简单。

可以得出,编程代码具体采用TCP协议还是UDP协议,完全取决于上层的应用场景,如果场景严格要求数据传输过程中的可靠性,那么就采用TCP协议,如果应用场景允许数据在传输出现少量丢包,那么我们肯定优先选择UDP协议,因为UDP协议足够简单。

tips:

一些优秀的网站在设计网络通信算法时,会同时采用TCP协议和UDP协议,当网络流畅时就使用UDP协议进行数据传输,而当网速不好时就使用TCP协议进行数据传输,此时就可以动态的调整后台数据通信的算法。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值