zoukankan      html  css  js  c++  java
  • 第二篇:网络基础

    OSI参考模型   与  TCP/IP模型

    应用层    -  >   应用层

    表示层

    会话层

    传输层  ->   传输层

    数据链路层    ->  网络接口层

    物理层

    一般主要考察TCP/IP,因为TCP/IP才是常用的,OSI只是理想上

    各层设备及传输单位

    物理层:中继器    集线器      单位:bit流

    数据链路层:网桥   交换机  网卡    单位:帧

    网络层:路由器   三层交换机    单位:包

    传输层及以上: 网关        单位: 段

    TCP 与 UDP

    UDP:udp提供数据报服务,面向无连接的,他的数据不保证顺序发送,他的传输速度比较快,并且可以同时建立多个连接,但是容易丢包并且没有应对措施,不安全不可靠,应用于实时性比较强的场合,如流媒体,还有广播

    TCP:tcp提供可靠传输,速度比较慢,比UDP多了三次握手的过程,还有他的功能,流量控制,拥塞控制,路由选择,会考虑当前网络环境的好坏,如果网络差,会为了防止丢包而暂缓发送数据,所以会比UDP慢上很多,按顺序发送,但是不一定是按顺序到达

    TCP的建立连接与终止(重中之重

    TCP建立连接调用函数步骤

    1,服务器端调用socket()连接

    2,服务器端调用bind()指定服务端口

    3,服务器端调用listen()等待监听客户端的到来

    4,客户端调用socket()建立连接

    5,客户端调用connect()主动连接服务器端,(注意,三次握手操作也是这里执行的,但是并不是由这个函数完成,这个只是去通知linux内核,让内核去实现三次握手)

    6,服务器端调用acept()进行完成连接

    7,相互通信传数据

    8,客户端close(),完成结束

    三次握手

    注意名词含义

    syn  代表一串序列号,连接请求和连接接受的报文

    ack  对发送来的报文进行确认,给予的答复

    fin   终止连接的请求

    步骤:

    1,客户端发送syn k给服务器端

    2,服务器端发送 带ack k+1的syn j给服务器端

    3,客户端发送 ack j+1给服务器端

    通俗来说

    1,客户端和服务器说   “我想和你连接”

    2,服务器和客户端   “好,我收到你的消息了,我同意,你听到我说的话后回我一声”

    3,客户端和服务器   “ok,我收到了”

    为什么不可以两次连接而要三次?

    答:因为如果两次连接的话,客户端发送的syn可能因为网络延迟还没到,客户端然后超时重传了一下,服务器和它连接后,如果后面收到之前那个syn包,就需要去向客户端确认一下,如果是两次连接,服务器端就会一直等待客户端发送数据,造成一个空连接浪费资源

    四次挥手

    步骤:

    1,客户端发送fin给服务器

    2,服务器发送ack给客户端

    3,服务器发送fin给客户端

    4,客户端发送ack给服务器

    通俗来说

    1,客户端和服务器说  "我东西传完了,我想关了"

    2,服务器和客户端     “稍等一下,我东西还没传完”

    3,服务器和客户端     “我东西传完了,收到消息请回复”

    4,客户端和服务器      “ok,收到了”

    特别说一下,可能会出现三次挥手的情况,就是当正好服务器端的数据也正好传完了,这个时候服务器可以把ack 和  syn同时发送给客户端

    还提一下,为什么每次一端发送有用的信息都必须回复一下,因为如果你不回复,另一端就会认为是不是在中途丢包,你没接收到,然后就会重传,直到回复为止,这也是为了确认是否知道了消息

      

    连接时的状态

    三次握手

     1,客户端发送syn 给服务器       进入  syn_sent  状态

    2,服务器之前是listen 状态   收到syn后  发送  带ack的 syn  进入  syn_rcvd

    3,  客户端 发送ack给服务器   进入established(连接,这个状态才可以传收数据)

    4,服务器收到ack  进入  established

    四次挥手

    5,客户端发送FIN     进入  fin_wait1

    6,  服务器回复 ack   进入close_wait   客户端进入 fin_wait2

    7, 服务器发送  fin  进入last_ack

    8,客户端收到进入time_wait  并且回复ack

    9,服务器收到 进入closed

    time_wait状态存在的理由?(存活时间2MSL)

    1,防止发送的ack包没有到达,这个时候服务器没收到会重新发送syn来,如果直接断开就没搞头了

    2,让外面的超时节点死掉,因为每个包都有自己的存活时间MSL,因为如果之前网络有问题,然后超时重发,重新建立连接,但是网络一好就会有重复包出现,这个时间这个状态存在,可能等过了他的存活时间再发送,因为time_wait状态时间是2MSL

    为什么是2MSL呢,因为 服务器-syn-客户端  一个MSL     客户端-ack-服务器   一个MSL

     其他不怎么重要和比较基础就不写了(懒 >_<)

  • 相关阅读:
    error C2054: 在“inline”之后应输入“(”
    SendInput模拟键盘操作
    获取广电高清直播源
    Lua使用luasocket http请求例子
    枚举所有继承特定接口的类
    Stream Byte[] 转换
    async await
    C# ServiceStack.Redis 操作对象List
    resharper安装后,一不小心点错了(选择了object browser)
    fiddler 挂载 JS文件
  • 原文地址:https://www.cnblogs.com/Lis-/p/12262246.html
Copyright © 2011-2022 走看看