Linux网络:socket网络套接字
文章目录
- 1. 网络基础补充
- 1.1 以太网
- 1.2 局域网通信原理
- 1.3 跨网络通信
- 2. 网络套接字
- 2.1 端口号vs进程pid
- 2.2 网络字节序
- 序:在上篇文章中我们对OSI七层网络模型和TCP/IP网络模型,主要对操作系统与网络技术栈的关系进行的探讨,并且对网络传输的基本流程进行了深刻的讲解,而本篇文章将正式进入网络套接字的了解,深入了解网络通信
1. 网络基础补充
1.1 以太网
问题一:在以太网上,是怎么进行通信的,一台主机是怎样将数据传递给另一台主机的?
以太网的通信就好像同学们在一间教室上课。
当老师点名张三回答问题的时候,班级里面的所以同学都听到了,但是只有张三会起来回答问题,而在网络通信中,也是这样,我们向网络中发生报文,所有的主机都会接收到这个报文,当各个主机解析这个报文时,发现这个报文并不是发给自己的,就会主动丢弃这样的报文,而特定的主机(张三)能正确识别这样的报文,就会继续解析,直到传输到应用层。在这样的通信环境中,发送数据的主机认为只和接收端的主机进行的通信,接收端认为之和发送端进行的通信,实际上发送端发生的数据,在一个范围内,所有的主机都能够接收到,而这样的通信方式,就是局域网的通信方式,也就是以太网的通信方式。
以太网通信:每台主机在局域网上,都要有自己的唯一的一个标识(每台主机都有一个Mac地址,每一个网卡在出厂时都有自己唯一的48比特位的序列号,这样的序列号信息就是Mac地址)其中的Mac地址是全球唯一的
1.2 局域网通信原理
数据包封装和分用不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报 (datagram),在链路层叫做帧(frame).
应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation).
首部信息中包含了一些类似于首部有多长, 载荷(payload)有多长, 上层协议是什么等信息.
数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部, 根据首部中的 “上层协议字段” 将数据交给对应的上层协议处理
局域网通信原理:
在单纯的局域网当中,如果要发送报文,最外层的数据帧里面一定要包含原Mac地址src和目标Mac地址dst,如图所示,如果M1的向M5发送数据,就要把数据发送到局域网中,而局域网中的所以主机都能够接收到,这里的收到是指在主机的网卡中(硬件)收到了。
收到后各个主机会同一时间在数据链路层对这段数据进行处理和分析(报头和有效载荷分离),将报头分离出来后就要分析报头中的内容,然后将目标Mac地址和自己主机的Mac地址进行分析,如果目标Mac地址不是当前主机,该数据就会被直接丢弃(数据链路层做的),其上层也就不会获取其他信息了,在应用层看来就是没收到数据!!!
以太网发生数据碰撞问题:
在生活中,如果人处于一个嘈杂的环境里是很难快速精准的知道别人在说什么的,即使是在对你说,同理在局域网中,如果局域网中有很多的数据和信号,就会发生数据碰撞的问题,导致接收端接收不到数据,而为了解决这样的问题,发生主机都要执行碰撞避免算法,而众多主机构成的局域网叫做碰撞域
网卡的工作模式:正常模式和混杂模式(网卡和驱动程序配合,抓包软件的原理:获取到不是发给本主机的数据后,并不丢弃,而是依然接收)
局域网通信的本质:局域网就是一种临界资源(任何时候局域网中只能有一太主机在发送数据,就像锁一样,在同一时间只能有一个主机访问局域网)
所以局域网的范围不宜过大,局域网越大,网络碰撞的概率也越高,但如果必须满足一个大的局域网,就必须要有交换机的设备,该机器能够有效的降低数据包碰撞的概率(划分碰撞域)
1.3 跨网络通信
如果一台主机要跨网络通信,就要通过路由器来实现
在client端,把数据交给route路由器,本质也是局域网通信。
IP协议屏蔽了底层网络的差异化,靠的就是工作在IP层的路由器,IP实现了全球的软件虚拟层,一切皆是IP报文
IP地址和Mac地址的区别:IP地址,尤其是目的IP,一般是不会改变的,协助我们进行路径选择,Mac地址,出局域网之后,源Mac地址和目的Mac地址都要被丢弃,让路由器重新封装。
2. 网络套接字
问题一:在进行网络通信的时候,是不是两台机器在进行通信?
1. 网络协议中的下三层,主要解决的是,数据安全可靠的送到远端的机器
2. 用户层使用应用层软件(必须先将这个软件给启动起来,而一个软件启动起来了,就是该软件进程启动起来了,所以网络通信的本质也叫做进程间通信),完成数据发送和接收的
端口号无论对于客户端(client)和服务器(server),都能唯一标识该主机上的一个网络应用层的进程
认识端口号:其中端口号是传输层协议的内容
在公网上:IP地址能标识唯一的一台主机,端口号port,用来标识该主机上的唯一的一个进程(IP:port = 标识全网唯一的一个进程)
2.1 端口号vs进程pid
问题一:Pid已经能够标识一台主机进程的唯一性了,为什么还要搞一个端口号???
1. 不是所有的进程都要网络通信,但是所有进程都要有pid
2. 是为了实现系统部分和网络功能的解耦合(就像所有学生都有标识唯一的身份证,但还是要搞一个来标识唯一的学号来表示这个学生。)
问题二:客户端是如何知道服务器的端口号是多少?
每一服务器的端口号必须是众所周知的,精心设计,被客户端知晓的
问题三:一个进程可以绑定多个端口号吗?一个端口号可以被多个进程绑定吗?
一个进程可以绑定多个端口号,但是一个端口号不能被多个进程绑定!!!
网络规定都是大端!!!所以,无论任何厂商是小端存储的设备还是大端存储的设备,想要使用网络的东西,都必须改成大端,才能正常使用网络。
2.2 网络字节序
问题一:我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分, 网络数据流同样有大端小端之分. 那么如何定义网络数据流的地址呢?
发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出;
接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存;
因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址.
TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节.
不管这台主机是大端机还是小端机, 都会按照这个TCP/IP规定的网络字节序来发送/接收数据;
如果当前发送主机是小端, 就需要先将数据转成大端; 否则就忽略, 直接发送即可;
总结:
文章先介绍网络基础,阐述以太网通信原理、局域网通信的数据封装分用及跨网络靠路由器通信,指出IP和Mac地址作用。接着聚焦网络套接字,说明端口号用于标识主机网络进程,对比端口号与进程PID,强调网络字节序为大端,解答相关常见问题,助理解网络通信底层逻辑。