2、C++游戏服务器—TCP详解
TCP详解
·
目录
一、TCP是如何利用IP的
- TCP如何将不可靠无连接转变成可靠有连接的
- ①.数据分割:TCP将应用程序的传输数据分割成合适的数据块(报文段)
- ②.定时器:每当TCP把消息发送出去后,就会建立一个timer定时器
- ③.延迟确认:接收者接收到TCP发送过来的数据包后,并不是马上发送确认,而是有一个很短暂的延迟,然后向发送者发送延迟确认
- ④.检验和:TCP会计算首部和数据的校验和,可以检测数据是否有错误
- ⑤.流量控制:TCP的发送方和接受方都会固定分配一块足够的内存
二、TCP首部
- TCP传输
- TCP如果没有选项:总字节数=20字节
- Link的传输最小是46字节:IP20字节,TCP20字节,剩余6字节补0
- TCP也是按照Big Endian格式传输的
- TCP首部含义
- ①.第1个4字节
- 0-15 -> Source port:自己的端口号
- 16-31 -> Destination port:目标端口号
- ②.第2个4字节:0-31 -> Sequence number —— 每发送一个包(数据分割的每个包)都会标记上Sequence number
- ③.第3个4字节:0-31 -> Acknowledgment number —— 确认的作用
- ④.第4个4字节
- 0-3 -> Data offset:首部长度
- 4-6 -> Reserved:扩展使用,实际没有用
- 7 -> NS:暂时与编程无关;8 -> CWR:暂时与编程无关;9 -> ECE:暂时与编程无关
- 10 -> URG:紧急指针标志位 —— =1的时候需要检查Urgent pointer的值
- 11 -> ACK:确认,一般消息都会带上这个标记
- 12 -> PSH:标志位收到消息的时候要尽快的把消息传递给应用层
- 13 -> RST:重新建立连接
- 14 -> SYN:要建立连接的时候会有这个标志
- 15 -> FIN:结束的意思
- 16-31 -> Windows Size:控制发送的字节(2字节,表示大小65535)
- ⑤.第5个4字节
- 0-15 -> Checksum:校验和
- 16-31 -> Urgent pointer:紧急指针
- ⑥.Options:额外信息 -> 会设置最长的报文大小mss -> 选项
- ①.第1个4字节
三、TCP的状态变迁
1 - TCP的状态
- CLOSED(SC) -> 实际上这是一个不存在的状态,最开始的默认状态
- LISTEN(S) -> 服务器等着客户端来连接
- SYN-SENT© -> 客户端尝试来连接服务器
- SYN-RECEIVED -> 服务器确认首次连接
- ESTABLISHED(S C) -> 建立连接了,双方可以发送数据(常态)
- FIN-WAIT-1(S C) -> 等待对方关闭
- FIN-WAIT-2(S C) -> 等待对方关闭
- CLOSE-WAIT(S C) -> 等待自己应用程序关闭
- CLOSING(S C) -> 等待对方确认自己的关闭
- LAST-ACK(S C) -> 等待最后一次确认消息
- TIME-WAIT(S C) -> 等待对象收到自己的关闭消息(服务器慎用)
2 - TCP连接确认:三次握手
3 - TCP连接断开:四次挥手
4 - TCP数据相互传送
- 两种传输数据:交互式(较小的)、成块(较大的)
- Nagle算法:尽可能的让每次数据传输多传一些,比如现在只有1个字节要发送,会等待一会,比如又有2个字节要发送,这时候就一次性将3个字节一起发送(游戏开发一般关闭这个算法)
- Window size:接口窗口大小
四、TCP定时器
- 重传定时器:主要为了防⽌报⽂丢失或者阻塞。当A向B发送报⽂时,就会启动重传定时器,若在定时器到达之后,仍没有收到B的确认报⽂,则A会重新发送上次发送的报⽂。同时,令重传定时器复位。继续计时
- 坚持定时器(Persist):当B向A发送了0窗⼝报⽂,B此时已经没有空间接受A发送的数据了,通知A停⽌发送;在A接收到B发送的0窗⼝报⽂后,就设⽴坚持定时器,当定时器到达后,A就向B发送⼀个探测报⽂。B收到探测报⽂后会给出A确认报⽂
- 保活定时器(KeepAlive):在服务器端设置保活计时器,服务器每收到客户机的⼀次消息,就重置保活计时器,时间通常为2⼩时。若2个⼩时都没有收到客户机发来的消息,服务器就像客户机发送⼀个探测报⽂,以后每隔75分钟发送⼀次。若连续发送了10个探测报⽂后客户机仍⽆响应,则服务器就会认为客户机故障,并断开这次连接(建议不需要使用TCP的保活定时器,由应用程序来确认保活)
- 2MSL定时器(TIME_WAIT):⽤于TCP“四次挥⼿”阶段。当客户端向服务器发送最后⼀次确认报⽂时,就设定⼀个时间等待及时器,等待2MSL时间后再结束连接(MSL:最长报⽂段寿命,⼤⼩为30s~2分钟。根据不同的应⽤有不同的设置)
五、Wireshark查看TCP连接与断开
- Wireshark:网络包探测软件,官网地址:https://www.wireshark.org/;下载:Download -> Windows Installer (64-bit)
- ping www.baidu.com:在CMD中使用命令
ping www.baidu.com
,查看百度的ip地址
- 使用Wireshark捕获包:捕获链接 —— 本地连接即可;捕获地址栏中输入 ——
ip.addr == 14.215.177.38
- 打开浏览器访问百度地址www.baidu.com,然后关闭,最后查看Wireshark工具
更多推荐
已为社区贡献2条内容
所有评论(0)