网络编程基础知识

通信 (通讯)的本质:某种物理信号的传输
 

通信 (通讯)需要两个最基本的条件:

(1) 物理媒介 (物理层面)

        电话线

        关纤

        ......

(2) 协议 (软件层面)

        网络协议

1. 网络协议层次模型

层次:模块,在一些大型软件应用中,通常把一些功能做成模块 (模块化)

        网络协议 -----> 模块

        固定为上一个模块可以调用下一个模块
 

网络数据到底是如何传输的:

        分层传输, 每层实现各自的功能和协议 ,将数据打包交给下一层或者拆包交给上一层处理


OSI (开放式系统互联)     七层模块

TCP / IP模型

应用层:

        为不同的应用程序提供各种服务和接口。应用层协议实现了在不同主机之间进行数据共享、数据查询和应用执行的功能。网络应用程序工作在TCP/IP模型的应用层,在网络应用程序中我们可以使用协议封装我们需要发送的数据

        常用的协议有:HTTP (超文本传输协议)、FTP (文本传输协议)、 Telnet (远程登录协议)、ssh (安全的远程登录协议),DNS (域名解析协议)等

传输层 (TCP和UDP工作在传输层):

        主要解决数据如何传输的问题。传输层主要提供了两种不同类型的服务:TCP和UDP

        TCP:传输层控制协议,是一种面向连接的传输层协议,它能提供高可靠性的通信 (即数据无错误,数据无丢失,数据无失序,数据无重复到达)    ---->打电话

        =====>建立连接

        "三次握手,四次挥手"

        "超时重传"

        UDP:用户数据报协议,它是不可靠的无连接的协议,因为在数据传输前,不需要进行连接,所有数据传输是不可靠的,传输效率高,应用在 "实时应用",直播,视频通话,发短信......


网络层 (IP工作在网络层):

        其主要作用是实现两个网络系统之间的数据透明传送,不同网络有着不同的网络层协议和地址规范,如果一个网络中的用户不能识别其他网络的通信协议和地址规范,那么这两个网络之间就不能进行数据通信

        其功能包括:IP地址分配,路由选择,包装和解封装,网络互联,分段与重组,基于IP协议的寻址和转发
        IP地址是用于在计算机网络上唯一标识和定位设备的数字标识。它是一个由数位组成的标签,用于表示网络中的每个节点 (如计算机、服务器、路由器等)。IP地址在网络通信中起 着至关重要的作用,它们标识了源设备和目标设备,使得数据包能够正确路由和传递。通过使用IP地址,计算机和设备可以相互发送和接收数据,并实现互联网上的各种服务和应用


物理层 (设备驱动和硬件):

        网卡

        网线

        MAC协议:每一台机器都有一个MAC地址 (物理地址)

        ......

2. 认识常见的网络设备和网络名词

猫 (调制解调器):

        把电信号变成数字信号

        把数字信号变成电信号


路由器 (工作在网络层):拨号 -----> 局域网

        作用:路由寻址,隔离广播域 ......

        选择网络数据的下一站,主要用于在不同的网络之间转发数据包,接收到一个数据包时,会解析数据包,查看目的IP地址,如果目的IP地址在本地局域网中,则会直接把数据包发送给目标主机,如果目的IP不在本地局域网中,则会把数据包发送给默认转发端口 (网关)


网关:

        计算机网络中的一种网络设备,用于连接不同类型、不同协议或不同速率的网络。它是实现不同网络互联的重要节点,可以使数据在不同网络之间传输和转换

        实质是一个网络通向另一个网络的IP地址

网卡:

        将计算机中的数据通过电缆或其他媒介传输到网络上,或者从网络上接收数据并传输到计算机中

集线器:

        不是智能的,物理上面相连,工作在物理层,将多个计算机连接在一起形成一个局域网,并使它们能够互相通信 (会将收到的数据包广播给所有处在该局域网的所有设备中)

交换机:
        工作在数据链路层,比集线器稍微智能,网络数据就是MAC地址的集合,能够区分源MAC地址和目的MAC地址,可以在局域网任意两个端口建立联系,不懂IP地址 (某些高级交换机还具有IP路由功能)

MAC地址:

        每一台机器的网卡都有一个MAC地址 (物理地址)

3. 互联网的IP地址

互联网上面的每一个接口 (网卡)必须有一个唯一的internet 地址 (也叫做IP地址),是一个逻辑地址 (协议上的一个编号),进行网络通信的时候,使用这个IP地址唯一的标识一台主机

ipv4:32位,4个字节

ipv6:128位,16个字节

问题:在百度上直接搜索显示的是internet 的 IP (公网IP),在linux (ifconfig)或者windows终端 (ipconfig)下输入命令,会显示私有IP,这两个IP有什么区别呢?

        公网IP一般是运营商分配的,只有公网IP才能上internet,但是不可能给每一个电脑分配一个公网IP,IPV4不够,所以需要私有IP,这种IP一般是用于局域网管理,不能直接连internet,必须通过公网IP

IPV4地址有32bit (4字节),那么怎么区分呢?

        一般把一个IP地址分为两个部分:"网段号"   "主机号"

        类似于日常生活电话号码中的“区号” 和 “主机号”


网段号:用来标识某一个局域网段

        在IP地址中连续的高位

主机号:用来标识某一个局域网段中特定的主机
        在IP地址中连续的低位

32bits,是32个0或者1,给人看,不太合适
=====>
        一般把IP写成“点分式”的IP字符串
        每8个bits表示一个数字,中间用 . 分隔开来


IP地址分类:

A类:IP地址范围:0.0.0.0 ~ 127.255.255.255

          私有地址范围:10.0.0.0 ~ 10.255.255.255  ---->用于局域网内部

          每一个局域网中,最大的主机数:2^24-2     除去网关和广播号


B类:IP地址范围:128.0.0.0 ~ 191.255.255.255

          私有地址范围:172.16.0.0 ~ 172.31.255.255  ---->用于局域网内部

C类:IP地址范围:192.0.0.0 ~ 223.255.255.255

          私有地址范围:192.168.0.0 ~ 192.168.255.255 ---->用于局域网内部

特殊的IP地址:

        127.0.0.0   回环地址,本地测试用

        169.254.0.0 ~ 169.254.255.255  自动配置地址,本地链路地址,用于主机主动获取地址失败后的临时通信

netmask (子网掩码):

        就是用来指定一个Ip地址中,哪些位是网络号,哪些位是主机号,netmask中为1的bit为网络号,为0的bit是主机号

问题:
        局域网内部192.168.1.4 和192.168.3.5 能不能直接通信?
                由netmask决定
                设置为255.255.0.0
                这两个ip就在同一个网段,就能直接通信

        
netmask前面一定是连续的1,后面是连续的0才是合法的
    
设置网卡的IP地址和子网掩码:
        ifconfig eth0 192.168.1.4 netmask 255.255.255.0 up
    
IP地址是用来唯一的标识网络上面一台主机的,但是一台主机上面可以跑多个网络应用程序
为了区分一台主机上面的多个应用程序
======>

        “端口号”

4. 端口号 (prot)

TCP和UDP使用无符号的 16bit 端口号来标识网络应用

IP地址只能够唯一的标识网络上面一台主机,但是一台主机上面可以跑多个网络应用程序,而且网络应用程序从传输层的角度来说,可以分为TCP应用和UDP应用

TCP的端口号和UDP的端口号相互独立

一台主机的网络应用程序至少由以下的东西确定:

        IP地址(网络层) + 传输层协议(TCP/UDP)(传输层) + 端口号

端口号由 IANA管理

        众所周知的一些端口 (已经公认定义或为将要公认定义的软件保留的):1 ~ 1023

                ftp:21     

                http:80 

                dns:53

                ......

        注册端口:1024 ~ 49151

        动态端口或者私有端口:49152 ~ 65535

5. 字节序问题

小端模式:低地址存放低字节

大端模式:低地址存放高字节   -----> 和人们阅读习惯一致


网络字节序,采用大端模式

大部分的主机都是小端模式,当应用程序将多字节整数传递给 socket 之前,需要转换成网络字节序,当应用程序从socket 上获取多字节整数时,需要转换成主机字节序

6. 三次握手,四次挥手

SYN:同步标志    ACK:应答标志    seq:序列号

6.1 三次握手

1. 客户端发送连接请求:

        客户端首先向服务器发送一个SYN=1 (同步) 数据包,其中包含客户端的初始序列号seq=x
        这个SYN包标志着客户端希望建立连接,并使客户端进入SYN_SENT状态

2. 服务器响应连接请求:

        服务器收到客户端的SYN包后,会回复一个带有SYN和ACK (确认)标志的数据包,表示服务器收到了客户端的连接请求,并同意建立连接
        在这个阶段,服务器也会选择一个初始序列号,并将客户端的序列号加1作为确认号,以确认客户端的接收能力
        这个阶段后,服务器进入SYN_RCVD状态

3. 客户端确认连接:

        客户端收到服务器的SYN 和 ACK包后,会发送一个带有ACK (确认)标志的数据包给服务器,表示客户端也同意建立连接
        在这个阶段,客户端将服务器的序列号加1作为确认号,以确认服务器的接收能力
        客户端和服务器都进入已建立连接的ESTAB-LISHED状态,可以开始进行数据传输

6.2 四次挥手

1. 客户端发送连接终止请求:

        客户端向服务器发送一个FIN (结束) 数据包,表示客户端已经完成了数据的发送,希望关闭连接
        客户端进入FIN_WAIT_1状态,等待服务器的确认或响应。

 

2. 服务器确认收到终止请求:

        服务器收到客户端发送的FIN包后,会回复一个ACK (确认)数据包给客户端,表示服务器已经接收到了客户端的结束请求
        在这个阶段,服务器进入CLOSE_WAIT状态,表示服务器已经准备好关闭连接,但是还有可能有一些数据需要发送给客户端

 

3. 服务器发送连接终止请求:

        服务器发送一个FIN包给客户端,表示服务器也准备关闭连接了。
        在发送FIN包之后,服务器进入LAST_ACK状态,等待客户端的确认

 

4. 客户端确认收到终止请求并关闭连接:

        客户端收到服务器发送的FIN包后,会回复一个ACK包给服务器,表示客户端确认收到了服务器的终止请求
        在这个阶段,客户端进入TIME_WAIT 状态,等待可能出现的延迟的数据包
        当客户端完成等待后,会关闭连接,进入CLOSED状态
        服务器收到客户端的确认后,也关闭连接,进入CLOSED状态

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值