套接字
大话
- create: 联系打招呼
- bind 起个名字
- listen 告诉有空
- connect 我说
- accept 你听
- write 嘴巴说
- read 耳朵听
- close 对话结束
专业
- create: 创建一个 socket
- bind 套接字标识,一般用于绑定端口号
- listen 准备接收连接
- connect 准备充当发送者
- accept 准备作为接收者
- write 发送数据
- read 接收数据
- close 关闭连接
socket
大话
- 文件描述符fd: 外卖订单编号, 美食如何做,采购食材等由商家处理
- 既定端口号: 房子的构造会有厕所
- 时序分配的端口号: 设计师分配房子其他非必要构造
专业
- 操作系统,它用于帮我们管理计算机可以使用的资源,当我们的程序要使用一个资源的时候,可以向操作系统申请,再由操作系统为我们的程序分配和管理资源。通常当我们要访问一个内核设备或文件时,程序可以调用系统函数,系统就会为我们打开设备或文件,然后返回一个文件描述符fd(或称为ID,是一个整数),我们要访问该设备或文件,只能通过该文件描述符。
- 标准既定的端口号
标准既定的端口号是静态分配的,每个程序都会有自己的端口号,每个端口号都有不同的用途。端口号是一个 16 比特的数,其大小在 0 - 65535 之间,0 - 1023 范围内的端口号都是动态分配的既定端口号,例如 HTTP 使用 80 端口来标识,FTP 使用 21 端口来标识,SSH 使用 22 来标识。这类端口号有一个特殊的名字,叫做 周知端口号(Well-Known Port Number)
。
- 时序分配的端口号
第二种分配端口号的方式是一种动态分配法,在这种方法下,客户端应用程序可以完全不用自己设置端口号,凭借操作系统进行分配,操作系统可以为每个应用程序分配互不冲突的端口号。这种动态分配端口号的机制即使是同一个客户端发起的 TCP 连接,也能识别不同的连接。
多路复用和多路分解
大话
- 无连接
- 目的 IP 地址 : 房间地址
- 目的端口号 : 房间号
- 连接
- 源 IP 地址、目标 IP 地址、源端口号、目标端口号
UDP 报文结构
大话
源端口号(Source Port)
: 我的房间号目标端口号(Destination Port)
: 对方的房间号长度(Length)
: 消息长度校验和(Checksum)
: 用于判断是否出错
专业
源端口号(Source Port)
:这个字段占据 UDP 报文头的前 16 位,通常包含发送数据报的应用程序所使用的 UDP 端口。接收端的应用程序利用这个字段的值作为发送响应的目的地址。这个字段是可选项,有时不会设置源端口号。没有源端口号就默认为 0 ,通常用于不需要返回消息的通信中。目标端口号(Destination Port)
: 表示接收端端口,字段长为 16 位长度(Length)
: 该字段占据 16 位,表示 UDP 数据报长度,包含 UDP 报文头和 UDP 数据长度。因为 UDP 报文头长度是 8 个字节,所以这个值最小为 8,最大长度为 65535 字节。校验和(Checksum)
:UDP 使用校验和来保证数据安全性,UDP 的校验和也提供了差错检测功能,差错检测用于校验报文段从源到目标主机的过程中,数据的完整性是否发生了改变。发送方的 UDP 对报文段中的 16 比特字的和进行反码运算,求和时遇到的位溢出都会被忽略
TCP 概念
大话
全双工服务(full-duplex service)
双向沟通点对点(point-to-point)
一对一辅导发送缓存(send buffer)
临时数据块(chunk)
蛋糕切块报文段(segment)
: 蛋糕块添加的 TCP 头最大数据长度(Maximum Segment Size)
,俗称MSS
蛋糕的最大块是多大Maximum Transmission Unit
,最大传输单元 MTU : 传输种类 汽车还是火车
TCP 报文段结构
蛋糕如何切, 运输途中出现问题如何处理
大话
- 32 比特的
序号字段(sequence number field)
: 数据流的字节编号 分段 , 每个分段的字节开头 - 32 比特的
确认号字段(acknowledgment number field)
由这次数据给出期望值 - 4 比特的
首部字段长度字段(header length field)
- 16 比特的
接受窗口字段(receive window field)
大小控制 - 可变的
选项字段(options field)
最大报文长度 - 6 比特的
标志字段(flag field)
标识ACK
标志用于指示确认字段中的值是有效的,这个报文段包括一个对已被成功接收报文段的确认;RST
、SYN
、FIN
标志用于连接的建立和关闭;CWR
和ECE
用于拥塞控制;PSH
标志用于表示立刻将数据交给上层处理;URG
标志用来表示数据中存在需要被上层处理的 紧急 数据。- 紧急数据最后一个字节由 16 比特的
紧急数据指针字段(urgeent data pointer field)
指出。
- 紧急数据最后一个字节由 16 比特的
专业
-
序号字段
- 假设数据是 10000 字节,MSS 是 2000 字节,那么 TCP 就会把数据拆分成 0 - 1999 , 2000 - 3999 的段,依次类推
- 第一个数据 0 - 1999 的首字节编号就是 0 ,2000 - 3999 的首字节编号就是 2000
-
确认号 我发了 0-10字节,期望下次是 11字节-剩下的字节, 那么确认号就是 11
- 单工通信 广播
- 全双工 电话 TCP
- 半双工 对讲机
-
累积确认
- 超时重发
- 我传过去丢包
- 他传过来丢包
- 他传过来未丢包,但是超时了
- 接收方立刻丢弃失序的报文段
- 接收方接受失序到达的报文段,并等待后续的报文段(推荐)
-
窗口
- 前面是一问一答
- 不用等回答发送多个报文
-
滑动窗口(Sliding window)
- 分段块很多的处理, 比如 每次处理 10 个, 第一次发前 10块(1-10), 若接收到第一个 那么向前滑动, 变为处理(2-11) 以此类推, 同时 第 1 块的缓存也会被释放
-
高速重发控制
A 若第一次失败不会等待继续发送, B 确认号没有响应 那么冗余 ACK(响应)
多次重复发送给 A , 最后 A 会重传 -
流量控制服务(flow-control service)
- 原因: 商家订单并不是马上做, 而是等待超市商品,当商家做菜速度过慢,那么订单就会爆满无法交货
- 解决:
接收窗口(receive window)
这个东西来告诉平台我还能做多少单
连接管理
大话
-
三次握手
- 特殊的 TCP 报文段:
SYN 标志位
1 1 0 (3次)初始序列号(client_isn)
客户端 0, +1 (SEQ, ACK)初始序号(server_isn)
服务端 0, +1 (SEQ, ACK)
- 关闭: FIN=1, ACk 四次挥手简化
- 我要关闭我告诉你, 你收到信息告诉我你收到我要关闭的信息
- u ->, <- v, u+1 (FIN-WAIT-1 , CLOSE-WAIT)
- 你也说我要关闭, 我发送信息给你说收到知道你要关闭的信息
- u+1, w+1 -> , <- w, u+1 (FIN-WAIT-2丶TIME-WAIT, LAST-ACK)
被动打开(passive open)
耳朵主动打开(active open)
嘴巴
- 特殊的 TCP 报文段:
-
四次挥手
FIN-WAIT-1
: 第一次发出,等待回答前的状态MSL
是 TCP 报文段可以存活或者驻留在网络中的最长时间TIME-WAIT
等待 2MSL
专业
在一个 TCP 连接的生命周期内,运行在每台主机中的 TCP 协议都会在各种 TCP 状态(TCP State)
之间进行变化,TCP 的状态主要有 LISTEN、SYN-SEND、SYN-RECEIVED、ESTABLISHED、FIN-WAIT-1、FIN-WAIT-2、CLOSE-WAIT、CLOSING、LAST-ACK、TIME-WAIT 和 CLOSED 。这些状态的解释如下
LISTEN
: 表示等待任何来自远程 TCP 和端口的连接请求。SYN-SEND
: 表示发送连接请求后等待匹配的连接请求。SYN-RECEIVED
: 表示已接收并发送连接请求后等待连接确认,也就是 TCP 三次握手中第二步后服务端的状态ESTABLISHED
: 表示已经连接已经建立,可以将应用数据发送给其他主机
上面这四种状态是 TCP 三次握手所涉及的。
FIN-WAIT-1
: 表示等待来自远程 TCP 的连接终止请求,或者等待先前发送的连接终止请求的确认。FIN-WAIT-2
: 表示等待来自远程 TCP 的连接终止请求。CLOSE-WAIT
: 表示等待本地用户的连接终止请求。CLOSING
: 表示等待来自远程 TCP 的连接终止请求确认。LAST-ACK
: 表示等待先前发送给远程 TCP 的连接终止请求的确认(包括对它的连接终止请求的确认)。TIME-WAIT
: 表示等待足够的时间以确保远程 TCP 收到其连接终止请求的确认。CLOSED
: 表示连接已经关闭,无连接状态。
上面 7 种状态是 TCP 四次挥手,也就是断开链接所设计的。