TCP/IP协议
第1章 概述
协议分层概念基于一个称为开放系统互连标准(OSI)的模型,该模型由国际标准化组织(ISO)定义的 。
ISO定义的标准7层OSI模型
编号 | 名称 | 描述 |
---|---|---|
7 | 应用层 | 指定完成某些用户初始化任务方法,应用协议通常由应用开发者设计和实现m,例子包括FTP, Skype等 |
6 | 表示层 | 指定针对应用的数据表示格式和转换规则的方法。通常加密有时与本层相关,但是也可以在其他层中(数据格式化 数据加密) |
5 | 会话层 | 指定多个连接组成一个通信会话方法。(建立管理和维护对话) |
4 | 传输层 | 指定运行在相同计算机系统中的多个程序之间的连接或关联的方法。如果在其他地方没有实现,本层可能实现可靠的投递(例如 TCP,UDP,ISO TP4 ) |
3 | 网络层 | IP选址及路由选择 |
2 | 数据链路层 | 指定经过单一链路通信的方法,包括多个系统共享同一介质时的"介质访问"控制协。本层通常包括差错检测和链路层地址格式(例如: 以太网, Wi-Fi, ISO 13239/HDLC ) |
1 | 物理层 | 指定连接器, 数据速率和如何在某些介质上进行位编码。 |
TCP/IP 四层模型
- 应用层: 包括会话层,表示层, 应用层
- 传输层
- 网络层
- 网络接口层: 对应物理层和数据链路层
第10章 用户数据报协议(UDP)和IP分片
UDP是一种保留消息边界的简单的面向数据报的传输层协议。它不提供差错纠正,队列管理,重复消除,流量控制和拥塞控制。它提供差错检测, 包含我们在传输层碰到的第一个真实的端对端(end-to-end)校验和。
下图为一个UDP数据报作为单个IPv4数据报的封装。
UDP头部
端口号相当于邮箱, 帮助协议辨认发送和接收进程。它们纯属抽象的(不与主机上任何物理实体相关)。 在UDP中,端口号是正的16比特的数字, 源端口号是可选的 ; 如果数据报的发送者不要求对方回复的话,它可被置为0 ;
UDP头部(8字节): 源端口号(2字节) + 目的端口(2字节) + 长度(2字节) + 校验和(2字节)
UDP长度字段是UDP头部和UDP数据的总长度,以字节为单位。这个字段的最小值是8 。
UDP/IPv4分片
如果数据报的大小操过链路的MTU (最大传输单元Maximum Transmission Unit ), 那么IP数据报就要被分割成多个IP分组, 这就可能导致性能问题, 如果任何一个分片丢失, 整个数据报就丢失了。
第12章 传输控制协议(TCP)
TCP头部, 它的标准长度20字节, 除非出现选项。在TCP术语中, 一个IP地址和端口的组合有时被称为一个端点 (endpoint) 或者套接字(socket) ; 每个TCP连接由一对套接字或端点(四元组, 由客户机IP地址, 客户机端口号, 服务器IP地址及服务器端口号组成)唯一的标志。
名称 | 描述 |
---|---|
CWR | 拥塞窗口减(发送方降低它的发送速率) |
ECE | ECN回显(发送方接收到一个更早的拥塞通告) |
URG | 紧急(紧急指针字段有效 很少被使用) |
ACK | 确认(确认号字段有效 连接建立后一般都是启用状态) |
PSH | 推送(接收方应尽快给应用程序传送这个数据) |
RST | 重置连接(连接取消, 经常是因为错误) |
SYN | 用于初始化一个连接的同步序列号; |
FIN | 该报文段的发送方已经结束向对方发送数据。 |
第13章 TCP连接管理
TCP是一种面向连接的单播协议。发送数据前,通信双方必需在彼此之间建立一条连接 。由于需要对连接状态进行管理,TCP被认为是一个比UDP协议复杂得多的协议。
TCP连接的建立与终止
一个TCP连接由一个4元组构成, 它们分别是两个IP地址和两个端口号。更准确的说, 一个TCP连接是由一个对端点或套接字构成,其中通信的每一端都是由一对(IP地址,端口号)所唯一标识。
一个TCP连接通常分为三个阶段: 启动, 数据传输(也称 连接已建立) 和退出(关闭) 。
-
第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server, Client进入SYN_SENT状态,等待Server确认。
-
第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
-
第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
Wireshark抓包如下:
上图为第一次握手客户端发送SYN = 1 ,seq = 0 (随机数J);
上图为第二次握手.
上图为第三次握手,Client收到确认后,检查ack是否为J+1 。