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 个字段正是用于对分片和重组进行控制的。
原文地址:https://www.cnblogs.com/liujunjun/p/13026195.html