TCP 和 IP
Table of Contents
OSI 7 层
应用层, APDU, 和用户交互
用户接口,用户服务, 如浏览器
表示层, PPDU
将用户认识的数据 转换成 计算机所认识的语言(二进制)
加密,压缩
会话层, SPDU
对应会话管理,同步 (判断是否需要网络传递), 如果不需要就保存到磁盘, 不需要到传输层
传输层, TPDU
TCP 可靠
UDP 快,不可靠
决定使用 TCP,UDP
错误检测
确定端口号: 确定服务, 例如 www(80), 接收 ftp(110), 发送 mail(25)
TCP 分组报文: 报文段
UDP 分组报文: 数据报
也可以 将 TCP 和 UDP 一起称为 报文段
TCP: 阻塞控制 (congestion control)
防止任何一条 TCP 链接用过多流量来淹没通信主机之间的链路和交换设备
平等共享网络链路宽带
UDP: 不可调节, 不可调节可能带来的问题
UDP 在多媒体应用上, 如果每个人都启动流式高比特率而无任何拥塞控制, 路由器中有大量的分组溢出, 以至于几乎没有 UDP 分组能成功地通过源到达目的的路径传输
如果是 TCP 协议就可以有效的拥塞
网络层, 报文
IP 地址, 发件的 IP 地址, 收件的 IP 地址
路径有很多条,决定传输路径, 经过哪些节点, 路由器
IP 协议, 网际协议, 不可靠, 把分组从源 IP 送到目的 IP
ICMP 协议, Internet 互联网控制报文协议 (ping)
IGMP 协议, Internet 组管理协议
数据链路层, 帧
成帧, 包装, 用 MAC 地址, 发件的 MAC 地址, 收件的 MAC 地址, 错误检测和修正
MAC 地址只用于局域网通信, 不能用于广域网
地址解析协议:ARP 协议
arp:将 IP 地址翻译成 网卡地址 (MAC 地址)
物理层, 比特
设备驱动程序和计算机中的网络接口卡. (处理物理接口细节), 以太网协议
传递数据给别人
接收别人传递来的数据
分类和私有 IP
1.0.0.0 -- 126.255.255.255 127.0.0.1 128.0.0 -- 191.255.255.255 192.0.0 -- 223.255.255.255
10.0.0.0 -- 10.255.255.255 172.16.0.0 -- 172.31.255.255 192.168.0.0 -- 192.168.255.255
网关 gateway
MAC: 网卡硬件地址, 48 位, 局域网通信
交换机 不认识 IP, 只认识 MAC (链路层), 交换机在内网, 同一个网段进行
网关: 路由器, 用来访问不同的网段
封装 Encapsulation
应用程序用 TCP 转送数据, 数据被送入协议栈, 逐个通过每一层直到被当作一串比特流送入网络
每一层对收到的数据都要增加一些首部信息(可能有尾部信息).
TCP 传给 IP 的数据单元称作 TCP 报文段 segment, UDP 传送的数据称作 UDP 数据报, UDP datagram
IP 传给 网络接口层的数据单元称作 IP 数据报 datagram
通过以太网传输的比特流称作 帧 frame
用户数据--> TCP 报文 --> IP 数据报--> 以太网帧
分解 Demultiplexing
收到一个封装后的以太网 数据帧 时候, 数据就开始从协议栈中由底上升, 同时去掉加上的报文首部
客户-服务器模型
重复性服务器:
- 等待一个客户请求的到来
- 处理客户请求
- 发送响应给发送请求的客户
- 等待一个客户请求的到来…(重复)
缺点是当 服务器处理客户请求的时候, 无法等待一个客户请求的到来.
并发型服务器:
- 等待一个客户请求的到来
- 启动一个新的服务器来处理这个客户的请求, 同时并发等待客户的请求
链路层
- 为 IP 模块发送和接收 IP 数据报
- 为 ARP 模块发送 ARP 请求和接收 ARP 应答
- 为 RARP 发送 RARP 请求和接收 RARP 应答
IP 报文
假设我们要发送一堆数据, 首先会封装成 TCP 报文, 主要用于确定端口号, TCP 报文再封装成 IP 报
IP 数据报的最大长度是 2^16-1 = 65535 (字节)
TCP 报文段的数据部分 = IP 数据报的最大长度-IP 数据报的首部-TCP 报文段的首部 = 65535-20-20 = 65495 (字节)
MTU: 如果 IP 报文过大, 大于 MTU (默认 1500), 那么 IP 报文会再次被分割, 再经过路由转发
TCP 的链接
C: client
S: server
三次握手
- C 向 S 发送一个 SYN 信号, 表示我要访问你
- S 向 C 发送一个 ACK 确认, 并发送一个 SYN 问 C 是否准备好
- C 向 S 发送一个 ACK 确认
C ---> S (SYN) 状态: SYN_RCVD C <--- S (ACK + SYN) 状态: SYN_SENT C ---> S (ACK) 状态: ESTABLISHED
4 次挥手
- C 向 S 发送一个 FIN, 表示我要关闭
- S 向 C 发送一个 ACK
- S 向 C 发送一个 FIN, 表示我也要关闭
- C 向 S 发送一个 ACK 确认
C ---> S (FIN1) 状态: 有两个状态 FIN_WAIT_1 (出现在 C 接受之前), FIN_WAIT_2 C <--- S (ACK) 状态: TIME_WAIT C <--- S (FIN2) 状态: CLOSE_WAIT C ---> S (ACK) 状态: LAST_ACK