## TCP首部
> 先来一张图~ 1字节(byte) = 8bit~
![](https://img.kancloud.cn/12/44/1244c3e3ca6c2414bb1c0565bad75aad_500x329.png)
* **TCP端口**
* TCP端口就是为TCP协议通信提供服务的端口。(80, 8080之类)
* **源端口**
* 包含发送数据报的程序所使用端口
* **目的端口**
* 接收数据报的程序所使用端口
* **序号**
* 序号用来标识从TCP发送端向TCP接收端发送的数据字节流,在一个 TCP 连接中传输的字节流中的每个字节都按照顺序编号,**序号**是本报文段发送的数据组的第一个字节的序号。
> 第一个 TCP 报文段包含的是第一个 25kb 的数据,0 ~ 25599 字节, 该报文的序号的值就是:0
> 第二个 TCP 报文段包含的是第二个 25kb 的数据,25600 ~ 51199 字节,该报文的序号的值就是:25600
> ...
* **确认号**
* 指明下一个期待收到的字节序号,表明该序号之前的所有数据已经正确无误的收到。确认号只有当ACK标志为1时才有效。
* **数据偏移/首部长度**
* 表示报文中除开有效数据段,报文首部的长度。所以数据偏移的最小值是20字节(固定首部)。
* **保留**
* 保留,一般置为0。
* **URG**
* 紧急指针标志,当URG值为1时,发送方应用程序告诉发送方的TCP有紧急数据需要处理,TCP就将紧急数据放到数据区的最前面。紧跟其后是普通数据。
* **ACK**
* 确认序号标志,当ACK=1时,确认号才有效。当ACK=0时,连接都还没建立,不可能传送有效数据。
* **PSH**
* push标志,为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。
* **RST**
* 重置连接标志,用来拒绝一个非法的报文段和拒绝打开一个连接,RST也可称为重建位或者重置位。
* **SYN**
* 同步序号,用于建立连接过程,当SYN置为1时,表示连接请求或连接接受报文。
* **FIN**
* finish标志,用于释放连接,为1时表示发送方的数据已发送完毕,请求释放连接。
* **窗口**
* 滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。
> 例如,发送了一个报文段,确认号1001(期望下一个收到的报文中,数据区第一个字节的序号是1001),窗口字段是1000。就是告诉对方:“从1001开始,我最多只能接受1000个字节的数据,你发送数据的时候考虑下这点。”
* **检验和**
* 发送端对TCP首部、数据进行CRC运算得出的结果。接收端收到数据后,对接收到的TCP报文段的首部、数据进行CRC运算,并跟TCP首部中的校验和进行对比,确保数据在传输过程中没有损坏。
* **紧急指针**
* 只有当 URG 标志置 1 时紧急指针才有效。表示紧急数据的长度,指出了紧急数据的末尾在报文段的位置。
* **选项**
* 最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。
* **填充**
* 选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍。
* **数据部分**
* TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。
- 版本控制之Git简介
- Git工作流程
- Git工作区、暂存区、版本库
- Git 指令汇总
- Git 忽略文件规则 .gitignore
- pull request
- HTTP简介
- HTTP - Keep-Alive
- HTTP缓存
- XMLHttpRequest
- Fetch
- 跨域
- HTTP 消息头
- TCP/IP
- TCP首部
- IP首部
- IP 协议
- TCP/IP漫画
- 前端开发规范
- 前端开发规范整理
- 前端未来规划
- HTML思维导图
- CSS思维导图
- 布局
- position,float,display的关系和优先级
- line-height、height、font-size
- 移动端适配
- JS 对象
- JS 原型模式 - 创建对象
- JS 预编译
- 探索JS引擎
- ES