一、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 -> 选项

三、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工具

在这里插入图片描述
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐