zoukankan      html  css  js  c++  java
  • socket编程

    一、客户端/服务器架构

    1.硬件C/S架构(打印机)

    2.软件C/S架构

      互联网中处处是C/S架构

      如某个网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种)

    C/S架构与socket的关系:

      学习socket就是为了完成C/S架构的开发

    二、ios七层

    2.1 互联网的本质就是一系列的网络协议

    2.2互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层

    2.3 tcp/ip五层模型

      

      我们将应用层,表示层,会话层并作应用层,从tcp/ip五层协议的角度来阐述每层的由来与功能,搞清楚了每层的主要协议就理解了整个互联网通信的原理。

      首先,用户感知到的只是最上面一层应用层,自上而下每层都依赖于下一层,所以我们从最下一层开始切入,比较好理解

      每层都运行特定的协议,越往上越靠近用户,越往下越靠近硬件

    2.3.1 物理层

      物理层功能:主要是基于电器特性发送高低电压(电信号),高电压对应数字1,低电压对应数字0

    2.3.2 数据链路层

      数据链路层由来:单纯的电信号0和1没有任何意义,必须规定电信号多少位一组,每组什么意思

      数据链路层的功能:定义了电信号的分组方式

    以太网协议详解:

      以前各个公司都是自己的分组方式,导致过于混乱,所以由此产生了以太网协议(ethernet)

    ethernet规定

    • 一组电信号构成一个数据包,叫做‘帧’
    • 每一数据帧分成:报头head和数据data两部分
           head                        data                    

    head包含:(固定18个字节)

    • 发送者/源地址,6个字节
    • 接收者/目标地址,6个字节
    • 数据类型,6个字节

    data包含:(最短46字节,最长1500字节)

    • 数据包的具体内容

    head长度+data长度=最短64字节,最长1518字节,超过最大限制就分片发送

    mac地址:

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

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

    2.3.3 网络层

           网络层由来:有了ethernet、mac地址、广播的发送方式,世界上的计算机就可以彼此通信了,问题是世界范围的互联网是由一个个彼此隔离的小的局域网组成的,那么如果所有的通信都采用以太网的广播方式,那么一台机器发送的包全世界都会收到,这就不仅仅是导致效率低的问题了,这将会导致一场网络界的灾难。

           所以,必须找出一种方法来区分哪些计算机属于同一广播域,哪些不是,如果是就采用广播的方式发送,如果不是,就采用路由的方式(向不同广播域/子网分发数据包),mac地址是无法区分的,它只跟厂商有关。

      网络层功能:引入一套新的地址用来区分不同的广播域/子网,这套地址即网络地址

    2.3.4 传输层 

      传输层的由来:网络层的ip帮我们区分子网,以太网层的mac帮我们找到主机,然后大家使用的都是应用程序,你的电脑上可能同时开启qq,暴风影音,等多个应用程序,那么我们通过ip和mac找到了一台特定的主机,如何标识这台主机上的应用程序,答案就是端口,端口即应用程序与网卡关联的编号。

      传输层功能:建立端口到端口的通信

    tcp协议:

      可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。

    以太网头 ip 头               tcp头               数据                                                    

    udp协议:

      不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包。

    以太网头 ip头                      udp头                            数据                                           

      tcp三次握手和四次挥手

       详见另一篇文章:https://www.cnblogs.com/Smart1san/articles/9271560.html

    2.3.5 应用层

      应用层由来:用户使用的都是应用程序,均工作于应用层,互联网是开发的,大家都可以开发自己的应用程序,数据多种多样,必须规定好数据的组织形式 

      应用层功能:规定应用程序的数据格式。

      如:TCP协议可以为各种各样的程序传递数据,比如Email、WWW、FTP等等。那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了”应用层”。

    2.3.6 socket

      两个进程如果需要进行通讯最基本的一个前提能能够唯一的标示一个进程,在本地进程通讯中我们可以使用PID来唯一标示一个进程,但PID只在本地唯一,网络中的两个进程PID冲突几率很大,这时候我们需要另辟它径了,我们知道IP层的ip地址可以唯一标示主机,而TCP层协议和端口号可以唯一标示主机的一个进程,这样我们可以利用ip地址+协议+端口号唯一标示网络中的一个进程。能够唯一标示网络中的进程后,它们就可以利用socket进行通信了,什么是socket呢?我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。

      socket起源于UNIX,在Unix一切皆文件哲学的思想下,socket是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。

    三、网络通信

    想实现网络通信,每台主机需具备四要素

    • 本机的IP地址
    • 子网掩码
    • 网关的IP地址
    • DNS的IP地址

    获取这四要素分两种方式

    1.静态获取

    即手动配置

    2.动态获取

    通过dhcp获取

    以太网头 ip头 udp头 dhcp数据包

    (1)最前面的”以太网标头”,设置发出方(本机)的MAC地址和接收方(DHCP服务器)的MAC地址。前者就是本机网卡的MAC地址,后者这时不知道,就填入一个广播地址:FF-FF-FF-FF-FF-FF。

    (2)后面的”IP标头”,设置发出方的IP地址和接收方的IP地址。这时,对于这两者,本机都不知道。于是,发出方的IP地址就设为0.0.0.0,接收方的IP地址设为255.255.255.255。

    (3)最后的”UDP标头”,设置发出方的端口和接收方的端口。这一部分是DHCP协议规定好的,发出方是68端口,接收方是67端口。 

    这个数据包构造完成后,就可以发出了。以太网是广播发送,同一个子网络的每台计算机都收到了这个包。因为接收方的MAC地址是FF-FF-FF-FF-FF-FF,看不出是发给谁的,所以每台收到这个包的计算机,还必须分析这个包的IP地址,才能确定是不是发给自己的。当看到发出方IP地址是0.0.0.0,接收方是255.255.255.255,于是DHCP服务器知道”这个包是发给我的”,而其他计算机就可以丢弃这个包。

      接下来,DHCP服务器读出这个包的数据内容,分配好IP地址,发送回去一个”DHCP响应”数据包。这个响应包的结构也是类似的,以太网标头的MAC地址是双方的网卡地址,IP标头的IP地址是DHCP服务器的IP地址(发出方)和255.255.255.255(接收方),UDP标头的端口是67(发出方)和68(接收方),分配给请求端的IP地址和本网络的具体参数则包含在Data部分。

      新加入的计算机收到这个响应包,于是就知道了自己的IP地址、子网掩码、网关地址、DNS服务器等等参数

  • 相关阅读:
    Codeforces 1485C Floor and Mod (枚举)
    CodeForces 1195D Submarine in the Rybinsk Sea (算贡献)
    CodeForces 1195C Basketball Exercise (线性DP)
    2021年初寒假训练第24场 B. 庆功会(搜索)
    任务分配(dp)
    开发工具的异常现象
    Telink MESH SDK 如何使用PWM
    Telink BLE MESH PWM波的小结
    [LeetCode] 1586. Binary Search Tree Iterator II
    [LeetCode] 1288. Remove Covered Intervals
  • 原文地址:https://www.cnblogs.com/Smart1san/p/9312086.html
Copyright © 2011-2022 走看看