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+portip 来自 IP首部
port 来自 TCP首部
Sequence Number用于标记定时器对那一数据包计时。Acknowlegment Number与延迟确认有关 -> ifACKsetChecksum与检验和有关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  | 
  |