Day 01
效率
开发效率:
C++11 -> auto、lambda、move
同步、异步、多线程、多进程…
运行效率
预备知识
- TCP/IP (网络编程都是此种协议)
- TCP -> 传输控制协议
- IP -> 网际协议
- Socket
- C++
- 指针、引用、地址、循环、函数、类…
- std::shared_ptr、std::thread、std::aync、decltype、std::future、right、reference
- 第三方库
- BOOST
问题:
1 | // 反转链表 |
IP网际协议详解
IP = Internet protocol suite
OSI模型(Open System Interconnection model)
IP模型
数据进入协议栈的封装
注意: Frame data 长度有要求,最小46字节,不足添0;最大1500个字节。
MTU(最大传输单元),当
传输数据 > MTU
时,则在IP层需要拆分成小包。
IP特点
- 不可靠(unreliable)
- 无连接(connectionless)
IP数据报格式首部字段
注意:【小小】 网络数据都是按照Big Endian【大端存储】传送的;家用操作系统都是Littele Endian数据存储。
思考题:
1 | static bool isLittleEndianSystem(){ |
TCP详解
TCP如何利用IP
- IP的特点
- TCP将应用程序的传输数据分割成合适的数据块
- 定时器
- 延迟确认
- 检验和CRC
- 流量控制
TCP首部
注意: IP首部20Byte,TCP首部20Byte,如需在网络传输,还需填充6Byte。
所谓的
Socket
, 即ip+port
ip 来自 IP首部
port 来自 TCP首部
Sequence Number
用于标记定时器
对那一数据包计时。Acknowlegment Number
与延迟确认
有关 -> ifACK
setChecksum
与检验和
有关Data offset
– 数据长度URG
-> 数据紧急标志位ACK
-> 数据确认标识位PSH
-> pushRST
-> resetSYN
-> 建立时需要FIN
-> 结束
TCP状态
TPC状态变迁
蓝线–server;棕线–client;虚线–异常
TCP的连接(三次握手)
TCP连接的断开(四次握手)
1.为什么断开要四次握手?
全双工,两边都需要确认
主动断开方,会进入TIME_WAIT
状态
TCP数据相互传送
- 交互式(小数据)与成块的数据两种
- 时间延迟确认
- Nagle算法[小数据积攒后再发送](游戏开发一般关闭这个算法)
- 接收窗口大小
TCP内部使用的定时器
- 重传定时器
- 坚持定时器(Persist)
- 保活定时器(KeepAlive)<建议不开启>
- 2MSL定时器(TIME_WAIT)
实战
Wireshark使用
需安装WinCap方能使用
筛选器
ip.addr==115.239.210.27 && ip.port==80
Socket API (Berkeley sockets, BSD Socket)
头文件
API函数
服务器和客户端的例子
TCP Socket 基本流程图
Code:
Server_main.cpp
1 |
|
Client_main.cpp
1 |
|