zoukankan      html  css  js  c++  java
  • OSI与TCP/IP

    ① 七层→应用层:OSI 参考模型中最靠近用户的一层,为应用层序提供网络服务;
    ② 六层→表示层:提供各种用于应用层数据的变法和转换功能,确保仪的系统的应用层发送的数据能够被另一个系统的应用层识别。(数据表示、加密,图片、文档、文字);
    ③ 五层→会话层:负责建立、管理和终止表示层实体之间的通信回话,该层的通信有不同设备中的应用程序之间的服务和请求相应。(通信设备可能存在多个会话);
    ④ 四层→传输层:提供面向连接(TCP)或非面向连接(UDP)的数据传递以及进行重传前的差错检测;
    ⑤ 三层→网络层:提供逻辑地址,供路由器确定路径;
    ⑥ 二层→数据链路层:将比特组合成字节,再将字节组合成针,使用链路层地址(以太网使用 MAC 地址)来访问介质,并进行差错检测。
    ⑦ 一层→物理层:在设备之间传输比特流,规定了电平、速度、和电缆针脚;

     也有人把TCP/IP称为5层

    OSI 与 TCP/IP 对比图:

     数据封装

    ① 数据在高层称之为:数据单元
    ② 到达传输层,再数据单元前封装协议头,称之为:数据段
    ③ 到达网络层,封装 IP 头部,称之为:数据包
    ④ 到达网络接口层,封装 MAC 地址,称之为:数据帧
    ⑤ 最终传输到物理介质,称之为:比特流
    四层传输层协议

    传输层定义了主机应用程序端到端的连通性,传输层最常用的两个协议TCP、UDP

    • TCP(Transmission Control Protocol):传输控制协议。
    • UDP(User Datagram Protocol):用户数据包协议

    TCP协议类型为6,UDP协议类型为17

    TCP报文

    因为存在 Options 选项,所以 TCP 头长度不固定,最小为 20 字节,最大为60 字节
    字段  说明
    Source Port
    2Byte,源端口号
    Destination Port
    2Byte,目标端口号
    Sequence Number
    4Byte,序列号,在 TCP 传送的数据流中,每一个字节都
    有一个序号,每发送一次数据包都会携带一个序列号
    Acknowledge Number
    4Byte,确认序列号,如果收到对端的一个数据包,会
    查看包中的序列号,并将序列号+对端 ACK 值的总和作为确认序列号返回给对
    端,表示此序列号的数据包已经收到,并期待收到下一个标识数据包的序列
    号是多少
    Header Length
    头部长度
    Resv
    6Byte,保留位,供往后应用,默认为 0
    URG
    紧急比特 URG,当 URG=1 时,注解此报文应尽快传送,而不要按本来的
    列队次序来传送。与“紧急指针”字段共同应用,紧急指针指出在本报文段
    中的紧急数据的最后一个字节的序号,使接管方可以知道紧急数据共有多长
    ACK
    确认比特 ACK,默认为 0,如果 ACK=1 时,确认序列号有效位,表明该
    数据包包含确认信息
    PSH
    急迫比特 PSH,默认为 0,当 PSH=1 时,表示通知接收端立即将数据提
    交给用户进程,不要在缓存中停留,等待更多的数据
    RST
    复位比特 RST,默认为 0,当 RST=1 时,注解呈现严重错误,必须开释
    连接,然后再重建传输连接。
     SYN
    同步比特 SYN, 当为 1 时,表示对端请求建立连接,TCP 三次握手第一
    次时 SYN 为 1
     FIN
    终止比特 FIN,为 1 时,表示数据发送完毕,请求断开连接
     Window
    2Byte,滑动窗口大小,,默示报文段发送方的接管窗口,单位为字
    节。此窗口告诉对方,“在未收到我的确认时,你可以或许发送的数据的字节数
    至多此窗口的大小。
    Checksum
    校验和
     Urgent Pointer
    紧急指针,当 URG=1 时,注解此报文应尽快传送,而不要
    按本来的列队次序来传送。与“URG”字段共同应用,紧急指针指出在本报文段
    中的紧急数据的最后一个字节的序号,使接管方可以知道紧急数据共有多长
    Options
    选项值,那些需要使用同步动作的程式如 Telnet 要处理好终端
    的交互模式就会使用到 option 来指定资料封包的大小因为 telnet 使用的资料
    封包都很少但又需要即时回应。Option 的长度为 0,或 32bit 的整倍数,如果不足
    则填充到满

     

     TCP 四次挥手:

     

    1:为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
    这是因为服务端的 LISTEN 状态下的 SOCKET 当收到 SYN 报文的建连请求后,它可以把 ACK 和 SYN(ACK 起应答作用,而 SYN 起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的 FIN 报文通知时,它仅仅表示对方没有数据
    发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭 SOCKET,也即你可能还需要发送一些数据给对方之后,再发送 FIN 报文给对方来表示你同意现在可以关闭连接了,所以 TCP 传输是一种全双工的模式,两端的传输都是相互分开的,
    TCP 断开也是相互独立的,它这里的 ACK报文和 FIN报文多数情况下都是分开发送的。
    2:为什么 TIME_WAIT 状态还需要等 2MSL 后才能返回到 CLOSED 状态?
    这是因为虽然双方都同意关闭连接了,而且握手的 4 个报文也都协调和发送
    完毕,按理可以直接回到 CLOSED 状态(就好比从 SYN_SEND 状态到 ESTABLISH 状
    态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的
    ACK 报文会一定被对方收到,因此对方处于 LAST_ACK 状态下的 SOCKET 可能会因
    为超时未收到 ACK 报文,而重发 FIN 报文,所以这个 TIME_WAIT 状态的作用就是
    用来重发可能丢失的 ACK 报文。

    a) 发送端首次发送数据包,Seq 序列号为一个生成数值,ACK 为 1(首次发送)
    b) 接收端接收到数据包,并希望得到下一个数据包(Seq+1),此时数据包中的的 Seq 为 1 用于确认收到发送端 ACK 为 1 的数据包,并将本端发送包的中
    ACK 置为 Seq+1,表示期待接收到下个数据包的序列号
    c) 发送端收到接收端的 TCP 确认包好,查看包中的 ACK 为 11,表示下个包的序列号,此时发送下一个包,并将 ACK 变为 2,表示第二次发送。

    滑动窗口机制:

    滑动窗口,在 TCP 建立之后传输数据时,用于管理数据流控的标识符。接收
    端在接收数据时会建立一个缓存区,并将缓冲区的大小标识符值放于 TCP 头部的Window 中,表示接收端目前缓存区可以接收的最大数据位多少。滑动窗口的作
    用用于接收端告诉发送端自己可以一次性接收的数据大小为多少。

    a) 主机 A 想服务器发起连接,传输数据给服务器 A
    b) 服务器 A 回复 ACK 信息,同时携带窗口大小为 3
    c) 主机 A 收到 ACK 确认信息后,发现窗口大小为 3,于是连续发送窗口大小为3 的容量的数据包给服务器 A
    d) 服务器 A 收到数据包后,内存满,此时读取一个数据包,内存剩余为 1,此时发送 ACK 确认,窗口大小为 1
    e) 主机 A 收到后,发送窗口大小为 1 的数据包给服务器 A

    UDP

    User Datagram Protocol,用户数据包协议,UDP 是一种面向无连接的传输
    层协议,传输可靠性没有保证。当应用程序对传输可靠性不高时,但是对传输速
    度和延迟要求较高时,可以使用 UDP 协议来替代 TCP 协议在传输层控制数据的转
    发。
    UDP 头部仅占 8Byte,传输数据时没有确认机制。UDP 适合于实时数据传输,
    如语音和视频通信。相比于 TCP,UDP 的传输效率更高、开销更小、但是无法保
    障数据传输的可靠性,保证数据的完整性是依靠应用层的服务对数据提供保证的。

     端口号

    主机使用端口号表示不同的网络服务。其中:0-1023 为知名端口号;1024- 65535 为动态端口号 常见协议端口号

     三层网络层封装

    字段  含义
    Version 4bit,表示 IP 协议版本号。目前的版本号是 4,即 IPv4。版本号 规定了数据报的格式。版本不同,其数据报格式也有所不同,如 IPv6 的报文 结构就和 IPv4 的结构不同。
    IHL 4bit,报文头长度 HLEN,表示报文头长度(行数)。报文每行长度为 固定 4Byte,所以报文头长度以 4 Byte 为单位计算。除 IP 选项(IP Options) 和填充(Padding)字段可以不存在外,其他各字段必须存在。这些必须存在 的字段是 5 个 4 Byte,共 20 Byte 长。因此,报文头长度值一般是 5 。又由 于报文头长度必须是 32bit 的整数倍,所以当一个含有 IP 选项字段的 IP 数 据报不是 32bit 的整数倍时,由填充字段用 0 补足,由于存在 Option 选项, 所以 IHL 不固定,为 20 到 60 字节
    Type of Service 服务类型。只有在有QoS差分服务要求时这个字段才起作用
    Total Length 16bit,数据包总长度,以 Byte 为单位表示整个 IP 数据报 长度,包括报文头及其携带的数据,可以表示最大值为 65535,所以三层 MTU 最 大为 65535
    Identifier: 16bit,标识字段,是发送者赋予数据报的标识符,接收者利 用 这个信息和源地址判断收到的分组属于哪个数据报,以便进行重组。因此, 在分片时,该域必须不加修改地复制到各分片的报文头中。
    Flags 3bit,标志位,只有低两位有效。第一 bit 为 0 时表示该分片是最 后一片,如果该位是 1 表示后面还有分片。第二 bit 为 0 时表示可以对数据 报进行分片,如果该位是 1 表示数据报不能分片。当该位设置为 1 而帧长度 不匹配又必须分片时,设备就会将数据报丢弃并返回错误信息。
    Fragment Offset 片偏移,指示本分片数据在初始数据报数据区中的偏移 量,偏移量以 8 Byte 为单位,重组时分片顺序由片偏移提供
    Time To Live 生存时间,简称 TTL,8bit,用来控制数据报在网络中存在 的时间。目前 TTL 的值并不代表时间,而是代表经由路由器的个数。数据报每经 过一台路由器时,路由器将 TTL 值减 1,一旦 TTL=0,系统就丢弃该数据报,并 返回错误信息。这样避免了路由出现环路时数据报在路由器之间无休止地循环。
    Protocol 8bit,协议,表示该数据报携带的数据是由哪个上层协议封装的, 也就是指示传输层的协议类型。如最常见的协议类型是 TCP 或 UDP
    Header Checksum: 16bit,头校验和,用于保证 IP 头数据的完整性。
    Address 分为源 IP 地址和目的 IP 地址,各占 32bit,表明数据的来源及其 到达的 76EE 的地。
    Padding 当 IP 报文头长度不是 32bit 的整数倍时,填充 0 来凑齐 32bit 整 数倍,没有实际意义
    Data: 来自第 4 层的数据段
    注:标识(Identification)、标志(Flags)、片偏移(Fragment Offset)这 3
    个字段与 IP 报文的传输有关。IP 数据报是网络层的数据单元,它需要被封
    装在第二层的数据帧中来传输。互联网是由各种二层规范不同的网络互联起
    来的产物,这些不同的网络的帧格式及帧长度各不相同。例如,以太网的帧
    和令牌环的帧在结构和长度上都不相同。IP 数据报在某个二层网络中能够
    被完全封装,到另一个二层网络中就未必可以。因此,IP 数据报有可能被分
    割,称为"分片(Fragmenting)",当数据到达目的地时还要对分片进行重
    组。上述 3 个字段正是用于对分片和重组进行控制的。
  • 相关阅读:
    2019 滴滴java面试笔试总结 (含面试题解析)
    2019 阿里java面试笔试总结 (含面试题解析)
    Mangos笔记
    Google 多源码管理工具 gclient
    构建系统介绍
    Ninja介绍
    小试 Ninja
    如何使用Ninja快速编译LLVM和Clang
    FMS4中的P2P功能
    Flex之HTML5视频播放解决方案
  • 原文地址:https://www.cnblogs.com/liujunjun/p/13026195.html
Copyright © 2011-2022 走看看