Python服务器运维笔记:第二章Linux - 1.2.8 TCP/IP协议

前言:本文是学习网易微专业的《python全栈工程师》 中的《服务器运维开发工程师》专题的课程笔记,欢迎学习交流。同时感谢老师们的精彩传授!

一、课程目标

  • ipv4协议
  • tcp协议
  • udp协议

二、详情解读

2.1.IP协议

ip协议规定了数据怎么从一台主机传输到另一台主机。

2.1.1.数据的传输

Python服务器运维笔记:第二章Linux - 1.2.8 TCP/IP协议

2.1.2.IP数据包

Python服务器运维笔记:第二章Linux - 1.2.8 TCP/IP协议
Python服务器运维笔记:第二章Linux - 1.2.8 TCP/IP协议
首部长度:
IP头部的大小,固定部分是5行,另有可选部分

区分服务器:
8位组成,表明服务质量。0~2位表示0~7的优先级别
3位: 最低延迟
4位:最大吞吐
5位: 最大可靠性
6位: 最小代价

总长度:
IP首部 + 数据部分总长
总长不能超过 2162^{16} ,所以在的数据需要折成片段。

标识: 16位组成,用于分片重组,同一个分片的标识相同。
Python服务器运维笔记:第二章Linux - 1.2.8 TCP/IP协议
标志: 3位组成
0位:0
1位:是否进行分片。0可以分,1不可分
2位:是否为最后一个包,0为最后一个包

片偏移:
13位组成,用来标识数据片段的位置,第一个分片为0,单位是字节。

生存时间:
8位组成,每经过一个路由吕减1,变为0时,弃包。

协议:
IP传输上层协议。比如:ICMP、TCP、UDP、......

首部校验和:
16位组成,用来检验IP首部是否被破坏。

源地址:
32位组成,发送端IP

目标地址:
32位组成,接受端IP

2.1.3.数据传输

IP数据包内的数据部分就是TCP或者UPD数据包,如下图所示:
Python服务器运维笔记:第二章Linux - 1.2.8 TCP/IP协议

数据传输打包或者解包过程,如下图所示:
Python服务器运维笔记:第二章Linux - 1.2.8 TCP/IP协议

2.2.TCP协议

tcp协议是面向连接的可靠的流数据协议tcp数据传输首先需要在两端之间建立虚拟连接,通过顺序控制与生发控制保证数据传输可靠性。

tcp由于需要建立连接,以及数据包纠正,所以不适合高速传输与实时性很高的场合,比如视频直播,语音通讯。

2.2.1.tcp数据报

Python服务器运维笔记:第二章Linux - 1.2.8 TCP/IP协议
源端口号:
16位组成,发送端端口号

目标端口号:
16位,接收端端口号

通常服务器端口号为固定的,客户端端口号为临时的。

***(Sequence Number):
32位,发送数据的位置,每发送一次累加该次字节数,第一次产生一个随机数,在这个基础上累加。

确认应答号(Acknowledgement Number):
32位,下一次应该收到的数据***,发送端收到这个信号就认为之前的数据发送成功。

数据偏移(Data Offset):
4位,TCP首部长度,固定长为20个字节,即值为5

控制位(Controller flag):
URG: 该位为1,表示需要紧急处理
ACK: 该位为1,表示应答有效
PSK: 该位为1,表示将收的数据提交给上层应用协议
RST: 该位为1,表示tcp连接异常,强制断开
SYN: 该位为1,表示用于建立连接
FIN: 该位为1,表示通讯结束,希望断开连接

窗口大小(window size):
16位,发送数据最大限制,如果为0,可以发送窗口探测

检验和:
检验数据是否完整与是否被修改

紧急指针:
紧急数据位置

2.2.2.tcp协议创建连接与断开连接过程

Python服务器运维笔记:第二章Linux - 1.2.8 TCP/IP协议

2.2.UDP协议

UDP协议不提供复杂的数据传输控制机制,面向无连接的通信服务,它将应用程序按照原样在网络传输。

对于数据包顺序,丢包等问题,由应用程序解决。UDP适用场合:
1.包总量很小的场合
2.即时通信
3.局域网内通信
4.广播通信

2.2.1.udp数据报头

Python服务器运维笔记:第二章Linux - 1.2.8 TCP/IP协议

三、课程小结

  • 01 IPV4协议
  • 02 TCP协议
  • 03 UDP协议