


文章目录
一、收发
1.A主机封装↓发送普通报文
1.1应用层,字节->字节流
1.2传输层,连接流⊇字节流=分流=串⊇窗⊇段)
1.2.1分流独串
1.2.2串里划窗
1.2.2.1原因
1.2.2.2大小
1.2.2.3滑程
1.2.2.4效果
1.2.3窗里切段
1.2.3.1原因
1.2.3.2效果
1.2.4段包字节
1.2.4.1效果
2.B主机接收分用↑普通报文
2.1传输层,段->串
2.1.1段组回串
2.2应用层,串=字节流
2.2.1串回字节流
3.A主机等ACK报文
3.1发普报需ACK确认
3.2超时与快速并行重传
3.2.1计时
3.2.1.1超时重传
3.2.1.1.1非报文边界序号
3.2.2计数
3.2.2.1快速重传
3.2.2.1.1非报文边界边界序号
3.2.2.1.2尾部段收不满ACK
3.3划窗地重发报文
4.B主机做ACK报文
4.1前缀确认
4.2覆前复进
4.3选择确认
4.4捎带返回
二、连接
1.内容
1.1主目的
1.2附保障
2.任务
2.1建立连接
2.1.1全握任务
2.1.2单握任务
2.2断开连接
2.2.1总挥任务
2.2.2单挥任务
3.先后
3.1建立连接
3.1.1一主先一被后式
3.1.1.1客先服后
3.1.1.1.1总量相等
3.1.1.1.2分配均少
3.1.2双主先式
3.1.2.1总量增方
3.2断开连接
3.2.1hasNext包囊close固定先后
3.2.1.1关划顺序编辑
3.2.1.2终断顺序
三、Socket
1.种类
1.1监听连接ServerSocket
1.1.1listen
1.1.2accept
1.1.3bind
1.2连接传输Socket
1.2.1connect
1.2.2getInputStream/getOutputStream
1.2.3close
1.2.4shutdownOutput
1.2.5bind
1.3连接外传输DatagramSocket
2.关系
3.状态
3.1建立连接时
3.1.1客户端Socket
3.1.1.1【无状态】
3.1.1.2【CLOSED】
3.1.1.3【SYN_SENT】
3.1.1.3.1收SYN创TCB
3.1.1.4【ESTABLISHED】
3.1.2服务器ServerSocket
3.1.2.1【无状态】
3.1.2.2【CLOSED】
3.1.2.2.1SYN+ACK固定合并
3.1.2.3【LISTEN】
3.1.2.4【SYN_RCVD】
3.1.2.5【ESTABLISHED】
3.2断开连接时
3.2.1首断Socket
3.2.1.1【ESTABLISHED】
3.2.1.1.1FIN的发告
3.2.1.2【FIN_WAIT_1】
3.2.1.3【FIN_WAIT_2】
3.2.1.3.1FIN的收知
3.2.1.4【TIME_WAIT】
3.2.1.4.1等待原因
3.2.1.4.22MSL原因
3.2.1.4.3发道可断,收道无断
3.2.1.5【CLOSED】
3.2.2后断Socket
3.2.2.1【ESTABLISHED】
3.2.2.1.1三或四次挥手
3.2.2.2【CLOSE_WAIT】
3.2.2.2.1CLOSE_WAIT堆积
3.2.2.3【LAST_ACK】
3.2.2.4【CLOSED】
一、收发
1.A主机封装↓发送普通报文
1.1应用层,字节->字节流
应用层有字节 就化为字节流 往TCP的连接流里传
1.2传输层,连接流⊇字节流=分流=串⊇窗⊇段)
整体一条连接流里面,断续的分流独串,TCP给连续字节串编号,串里划滑动窗口,窗里切出段发,段里包着字节
1.2.1分流独串
应用层往传输层传来的字节流 断插地进,连接流 续存为里面的分流,独隔成串
1.2.2串里划窗
发送方每收ACK地 会对当前所操串 划出一个
1.2.2.1原因
报文隔速无定,可以过速连发超量 而需要罩在,对方接收缓冲区能承受发完的窗口内切段
1.2.2.2大小
每窗口 = min(对方接收缓冲区还装得下多少的接收窗口rwnd,网络当前允许太猛地发多少的拥塞窗口cwnd) – 发送方在途未确发到的量,<=0时会停划窗口停发报文
1、rwnd收0,发送方探测: 当收到ACK里rwnd=0且还有数据待发时,发送方就会发送探测小段报文,刺激对方回复 一个带有对方最新接收窗口值的ACK 2、rwnd0变,接收方通知: 接收方的接收窗口从0增回有时,会发 带新窗口值,更新通知发送方的ACK
1.2.2.3滑程
右边界左移: 窗口里处右边界将发的报文 每发走后,窗口的右边界左移
左边界左移: 每收到ACK回复,计算窗口大小后,以窗口右边界为起点,向左展 窗口大小的长度 成到窗口的左边界
1.2.2.4效果
同一时间在干多事: 持续流水线并行发 保在窗内的段,保持在同时传输 拉满可到窗满的字节量,同时等待多份ack时间,重叠成一份时(接收方通过ack延迟应答,覆盖地累积确认,确实成了 只用后面的一个ack去确认与返回的) 提升了效率
划的滑动窗口越大,此窗此次可连发的报文就越多,传输的吞吐量就越高
1.2.3窗里切段
会对 串中划出的窗口 切成TCP段 无隔速地发完此窗
1.2.3.1原因
协议栈层中传报文 有大小能传限制,TCP传输层限制最大载荷长度MSS内地 切当前传输层维护的连发段窗口 出TCP段,使其往下再封的IP包在链路层最大载荷MTU内 而避免在IP层分片
1.2.3.2效果
如果不考虑 协议栈层传报文的大小限制:以一次整窗口 封作消息单位发送造的消息会更少; 但会丢失相同字节下,切成小段发 可能会增多重传的报文 但一定能减小要重传报文的大小
1.2.4段包字节
发送接收的段单位 里面包群合的多字节
1.2.4.1效果
相比以单字节作封单位地发送接收,以段包多字节作单位 会造更少的消息,经历更少次 每个消息都要执行的一套封装、发送、接收、分用、回复ACK 而节省成本
2.B主机接收分用↑普通报文
2.1传输层,段->串
2.1.1段组回串
TCP收来段 有组回串的 就往上传
2.2应用层,串=字节流
2.2.1串回字节流
传上来的串 解回连续字节
3.A主机等ACK报文
3.1发普报需ACK确认
普通报文的发送方/ACK报文的接收方 发送普通报文需要确认它到达,发了但收不到ACK的普通报文 就被放弃 去重传新搞新套的报文,直到此次发的普报有收到ACK确认,才算成功发送了它
3.2超时与快速并行重传
计时器在保底超时未收到它段的ACK重传前,计数器计满收到它段前面的ACK,会在超时重传以前,提前快速重传 而优化
3.2.1计时
每发报文,都有生成此报文的ACK超时计时器,进行 接收此报文的ACK的 时间计时:
- ACK到时,对应报文的计时器时间计清为0;
- ACK没到时,对应报文的计时器时间在持续增计
3.2.1.1超时重传
计时器等满对应报文的ACK,超过RTO=发去消息最长1ML+发回ACK最长1ML=2ML,报文去和ACK回,最慢此时也传回来了,断定是报文/它的ACK丢了,开始对此报文进行超时重传
超时重传 直到 收到返回ACK成功,或重传次数上限视为故障停下报错 而结束
3.2.1.1.1非报文边界序号
(对每个发送报文 返回的ACK的计时,其实计的是该报文里面每个序号的所有ACK的计时,接收时 利用ACK报文完整前缀检查的特点,收到ACK的某个序号,都能覆盖确认往前的所有序号都已到)
某序号的ACK超时未收到后,就会对该序号所处在的整个报文 进行重传
3.2.2计数
每串报文发送,都有生成一个 此串报文的ACK复数计数器,进行 接收此串报文的不同确认序号ACK的 个数计数: ACK到时,计数器计 此确认序号的ACK的个数 增1
3.2.2.1快速重传
计1概率: ACK计数器收到1个ACK计1时,有可能就是串头到此段完整检查完到头的确认序号,至少0个卡在此,最多1个卡在此,此时判断 报文慢还没到而误显丢的概率非常大;
计2概率: 收到2个相同确认序号时,有可能一个刚好到头来的,至少1个卡在此,最多2个卡在此,判断是报文慢还没到而误显丢的概率还大;
计3概率: ACK计数器收到3个相同确认序号的ACK后,知道:如果其中一个ACK是刚好此缺失段的前段的ACK检查完整无漏到头的尾序号,再+不包括可能早就有ACK检查卡在这但丢失没到的,至少已有目前两个ACK,针对到此段的丢失,而卡在检查到这了,能判断 此段因为,本报文慢,而误显丢的概率很小,是本报文丢的概率很大了(已经2个卡了),因此就对此报文进行重传了
3.2.2.1.1非报文边界边界序号
快速重传 收到某序号的ACK,计数满3后 就会对该序号所处在的整个报文 进行重传
3.2.2.1.2尾部段收不满ACK
靠近串尾部的段 算上它本身的,流程到它尽头检查的一个ACK,往后就剩很少的段发,ACK进行很少次的重复覆盖进流程检查,就很难返回全,满3个同一个地方确认序号的ACK 而触发快速重传了
3.3划窗地重发报文
重传时,是把要重发报文的所包含字节范围,划为一个新窗,可在里面切成多个段,封成多个小报文 来发送的
4.B主机做ACK报文
4.1前缀确认
每收报文 对应生成 对当前收到串 从串头,往到该报文尾 检查字节流前缀 完整连续收到哪确认序号停 而检找首丢失段 的ACK返回
4.2覆前复进
后面段的ACK 检查流程最长能到的尽头范围 覆盖包含前面段ACK的检查流程范围,所以前面因为报文丢/ACK丢,而没有进检查流程的内容 能被后面报文的ACK 拉补进同流程范围里面,后序号确认到,它包含的前面序号一起确定到,但相比是少了 那部分为流程整范围的一次检查,当时就出的一个ACK,对 此ACK的超时与快速重传是有影响的
4.3选择确认
制作该段的ACK,序号检查时 如果卡在了处前面的缺段,确认序号填后 也会往该ACK报文的扩展里的SACK 写入 因为检查被卡,而欠贷在后检的该段的序号
4.4捎带返回
ACK会延时等一下反向数据 有就放进ACK里捎带返回
二、连接
1.内容
1.1主目的
双方各自内容报文 共享到另方 
1.2附保障
ACK报文 确认分享到
2.任务
2.1建立连接
2.1.1全握任务
[发送SYN,接收ACK + 接收SYN,发送ACK] × (服务器 + 客户端) = 8
2.1.2单握任务
(发,收+收,发)×(服/客) = 4:
服务器客户端 谁先做完,隶属它端的单握任务 谁先进入ESTABLISHED
2.2断开连接
2.2.1总挥任务
[发送FIN,接收ACK + 接收FIN,发送ACK] × (服务器 + 客户端) = 8
2.2.2单挥任务
(发,收+收,发)×(服/客) = 4:
服务器客户端 谁先做完,隶属它端的单挥任务 谁先进入CLOSED
3.先后
3.1建立连接
3.1.1一主先一被后式
一方呈主动联系姿势,需要花费力气主动获取对方信息后,先发SYN; 一方呈被动回应姿势,收了SYN没有花费力气被动收知对方信息,后发SYN
3.1.1.1客先服后
客先服后:大量的客户端作先方,花费力气主动获取,作后方的少量服务器的信息 服先客后:少量的服务器作先方,花费力气主动获取,作后方的大量客户端的信息
默认使用的都是 可能有开销地等配到 客户端主先,服务器被后 地建立连接
3.1.1.1.1总量相等
需要获取的信息总量与获取花费的力气总量,谁先谁后都是相等的
3.1.1.1.2分配均少
个体分配到的信息获取量与力气花费量, 客先服后:平均每个服务器,花费大量力气,主动获取大量信息 > 服先客后:平均每个客户端,花费少量力气,主动获取少量信息
3.1.2双主先式
双方都可能有开销地等配到 呈主动联系姿势,都花费力气主动获取对方信息后,都先发SYN,最终谁先谁后,看报文实际到达先后
3.1.2.1总量增方
从一方获取一方收知 变成 双方获取,增了另方也主动的 获取信息量与花费力气量
3.2断开连接
断开连接时,Socket双方都已有对方信息,谁先断谁后断 都一样总量=0,分配均0 无讲究最终的谁先谁后
因此都是无等配一定无等开销地 谁数据发完要断时,就直接去断发送
3.2.1hasNext包囊close固定先后
(以下断开连接的讨论 都是默认在此写法下的)
hasNext包囊close 固定:
也就会导致:
3.2.1.1关划顺序
首断Socket是先发完当时的连接数据流的接收结尾前的剩余数据,再关闭发送通道,后面收FIN2后会划出又一个连接流的新的接收结尾,后划 会显有 新结尾界限前已收,但无发的剩余数据,既然当时是主动地发完当时剩余数据,关闭了:那么后来的这些新收的剩余数据也是无需要发的,且此时发送通道也已关闭无法再发的;
后断Socket是先划分出连接流的接收结尾,后面收FIN1就把此接收结尾前的剩余数据发完,后再关闭发送通道,此时连接流结尾后面 没有收了的剩余数据了
3.2.1.2终断顺序
谁先close去首断的,谁就会先终断完
三、Socket
socket是 在应用层,操作端口 的套接字对象
1.种类
1.1监听连接ServerSocket
一对多作收工厂,握手它流程里 首连接是被应收
1.1.1listen
由CLOSED切换为LISTEN监听状态,被应收,建连接
1.1.2accept
无就阻塞等待地 取出一个服务端的连接头
1.1.3bind
绑定IP与端口
1.2连接传输Socket
一对一作通道头,发收数据,握手它流程里 首连接是主联发
1.2.1connect
由CLOSED切换为SYN_SENT发文状态,主联发,建连接
1.2.2getInputStream/getOutputStream
进行连接里的双向数据传输
InputStream.read:
- 处在连接流接收的FIN结尾前,有数据->返回读到的字节
- 处在连接流接收的FIN结尾前,无数据->阻塞等待数据
- 处在连接流接收的FIN结尾后->返回-1
1.2.3close
当前端 发完连接流的结尾界限前的剩余数据,发送FIN,关闭此连接头的发送通道: 进入 双方都会关闭发送通道的 断开连接流程,总连接会经历 先一端关闭的半关闭,后两端都关闭的全关闭 状态
1.2.4shutdownOutput
当前端 发完连接流的结尾界限前的剩余数据,发送FIN,关闭此连接头的发送通道: 仅关闭此端发送通道,总连接最后只变成半关闭状态
1.2.5bind
绑定IP与端口
1.3连接外传输DatagramSocket
无对,发收连接外数据
2.关系
一个进程里面,可以占用多个端口; 一个端口,可以被包多个socket操作; 一个socket,最多在包一个端口操作;
3.状态
3.1建立连接时
3.1.1客户端Socket
3.1.1.1【无状态】
new=>CLOSED
3.1.1.2【CLOSED】
connect=>SYN_SENT
3.1.1.3【SYN_SENT】
(1)发送SYN1
(or2.1) 因为 SYN1报文丢 对方未收到SYN1而没发SYN2+ACK1 or 对方收到SYN1后,首发的/对方未收到ACK2而重传的,SYN2+ACK1 丢 所以 超时未收到SYN2+ACK1->重传SYN1; (or2.2)收到 对方收到SYN1后,首发的/对方未收到ACK2而重传的,SYN2+ACK1->返回ACK2=>ESTABLISHED
3.1.1.3.1收SYN创TCB
SYN段大小占一个字节序号,存储 双方,同步的初始序号与协商的参数,收到SYN后 会在己方内核里创建TCB控制块 保存这整条连接的状态:
3.1.1.4【ESTABLISHED】
收到 对方未收到ACK2而重传的SYN2+ACK1->返回ACK2发收处限制
在连接里 双向传输数据
3.1.2服务器ServerSocket
3.1.2.1【无状态】
new=>CLOSED
3.1.2.2【CLOSED】
listen=>LISTEN
3.1.2.2.1SYN+ACK固定合并
LISTEN监听到每个SYN,都是固定同时做好 它的一对,要发的SYNx+要返的ACKx 合并在同段 用一个消息返回,所以一定是三次握手
3.1.2.3【LISTEN】
收到 首发的/对方未收到ACK1而重传的,SYN1->发送SYN2+ACK1=>SYN_RCV
3.1.2.4【SYN_RCVD】
(or1.1)收到 因为首发的/未收到ACK2而重传的 SYN2+ACK1丢 所以对方未收到ACK1而 重传的SYN1->发送SYN2+ACK1; (or1.2)因为 首发的/未收到ACK2而重传的 SYN2+ACK1丢,对方未收到SYN2+ACK1而没发ACK2 or 对方收到SYN2+ACK1后,发送的ACK2丢 所以 超时未收到ACK2->重传SYN2+ACK1
(2)收到 对方收到SYN2+ACK1后,发送的ACK2=>ESTABLISHED
3.1.2.5【ESTABLISHED】
在连接里 双向传输数据
3.2断开连接时
3.2.1首断Socket
3.2.1.1【ESTABLISHED】
close->把输出缓冲区剩余数据发完->发送FIN1->关闭发送通道=>FIN_WAIT_1
3.2.1.1.1FIN的发告
发送FIN告诉对方 本端的发送通道关闭(接收通道仍开放)
3.2.1.2【FIN_WAIT_1】
收到ACK1=>FIN_WAIT_2
3.2.1.3【FIN_WAIT_2】
收到FIN2->内核划整条流的此端接收的结尾界限->发送ACK2=>TIME_WAIT
3.2.1.3.1FIN的收知
收到FIN得知 本端的接收通道,此刻往后就收不到对端信息了,因此此刻在内核的此条连接数据流划出 此前到达数据与此后到达数据的分界线 作此连接里面,由串合为整条数据流的,此端接收结尾,分界线结尾前就是 整条流在此端内核缓冲区的残留数据,next读完残留数据后: 1、hasNext返回False; 2、越结尾界next就会读到 整条数据流的此端尾部EOF 返回-1
3.2.1.4【TIME_WAIT】
等待2ML->内核释放所有连接资源=>CLOSED
3.2.1.4.1等待原因
首断Socket会先做完4步,发送里处最后的此个ACK2后 先完成单挥任务 先进入CLOSED后: 不能发SYN/FIN/ACK报文;能收SYN/FIN/ACK报文 但不会正常处理
后断Socket单挥任务排后 在处于做完第3步发送FIN2后,等待接收ACK2: 首断Socket第4步发送的这一个ACK2,可能迟丢 后断Socket超时未收到,重传FIN2
需要还处非CLOSED状态,等待2MSL 只备收首一次的 可能会重传来的头个FIN2
3.2.1.4.22MSL原因
3.2.1.4.2.1服务首重传
2MSL包含了 ACK2从首断Socket发送到后断Socket的时间 + ACK2到达后断Socket后,等待它开启重传的时间,为2MSL – 先前FIN2从后断Socket发送到首断Socket的时间 – ACK2从首断Socket发送到后断Socket的时间 + 重传FIN2从后断Socket发送到首断Socket的时间 =2MSL 能等到首个重传FIN2刚到
3.2.1.4.2.2防旧连接里的重传FIN2送到处新连接中的首断Socket中
3.2.1.4.2.2.1旧报送新连
每个Socket,一时最多只能建立处在一个连接中,报文 指定相同四元组信息 锁定向对方主机上的此Socket发送,到达时 此Socket可能已完成 新旧连接的断开建立,因而发到了 在非预期连接里的 此Socket上,此时Socket可能会把此报文误认为是 当前连接的对端传来的 而出错: 1、握手报文不可能: 建立连接握手阶段的报文 发到指定Socket上时,如果Socket已建立处在另外连接中,收到后能判断 此握手未建起连接的报文 一定不是已处连接的对端发来的 而丢弃 2、普通报文不可能: 在连接里,发向对端Socket的普通报文,最迟的都会 在对端Socket断开此连接再建立另一个连接前 就消失了,不可能发到 对端Socket的新连接里 3、挥手报文不可能: 断开连接4次挥手流程的报文,一定是它们先到达完,此连接里的对端后 才会断开的连接,它们不可能发到 断开连接后,再新建处,另连接中的对端Socket上 4、只有重传FIN2可能: 所以只有 首断Socket已单端断开后,后断Socket如果未收到ACK2而重传的FIN2报文,发送到 已单端断开的首断Socket时,首断Socket可能已经新建立起,处在了新连接中
3.2.1.4.2.3等2MSL到FIN2消失完再单断能新建
所以首断Socket发完,它端单挥任务的最后ACK2报文后,没有立即进入单端的断开,而是先等待2MSL后: 后断Socket最迟能在 首断Socket发ACK2后,再过2MSL-先前FIN2从后断Socket发送到首断Socket的时间 后重传发送FIN2,此后FIN2最长再过1MSL消失 所以在首断Socket发完ACK2后,将来可能重传的首FIN2,最迟需要在刻往后 2MSL-先前FIN2从后断Socket发送到首断Socket的时间+1MSL 后消失,2ML>2MSL-先前FIN2从后断Socket发送到首断Socket的时间+1MSL,等待完2MSL单端断开前 重传FIN2就已消失,它不可能发到 首断Socket等待2MSL断开后,再新建的另连接中
1MSL: 报文在网络中的最大生存时间; 报文能早到 但通过迷路 可以在网络上徘徊拉最长,消失前到达 而需的最大传输时间
3.2.1.4.3发道可断,收道无断
知道ip与端口,在连接里外 都是可通路径的选择:
例,发送通道已关闭,接收通道永打开下:
- FIN_WAIT状态:收FIN报文后,它的ACK报文 是由内核是发送的
- CLOSED静止状态:收FIN报文后,它的ACK报文 内核已经无法处理
3.2.1.5【CLOSED】
静止状态:
3.2.2后断Socket
3.2.2.1【ESTABLISHED】
收到FIN1->内核划整条流的此端接收的结尾界限->发送ACK1=>CLOSE_WAIT
3.2.2.1.1三或四次挥手
后断Socket 收到FIN得知对端发送通道关闭,在内核划此连接里整条流的此端接收结尾 与执行close关闭本端发送通道 是互无前后关联,谁先谁后都行都有可能 的两个独立无联步骤,它俩可能 随先,随后,随同时,随隔近,随隔远:
- 如果近,接收FIN1发送的ACK1 与执行close发送的FIN2 就合并在一个消息发送 成三次挥手;
- 如果远,就分开在两个消息发送 成四次挥手
3.2.2.1.1.1hasNext包囊close固定ACK1先FIN2后
代码把 执行close写在hasNext的判断里面,就能固定: 1、得先 收到FIN1(立返ACK1)得知对端发送通道关闭,内核划出整条流此端接收的结尾界限,next读完剩余数据,hasNext返回False 2、才后 进判断里面执行close,发完结尾界限前的剩余数据,发送FIN2,关闭本端发送通道 (原本后断Socket收到FIN1划了接收结尾后,哪时候关闭自己的发送通道,是由自己内部自由运行到close而定的,可能会半关闭状态很久;但hasNext包囊close下,收FIN1划接收结尾后,流程就固定会向,发完输出缓冲区的剩余数据,执行close,关闭自己发送通道进行了)
所以还是三或四次挥手,hasNext包囊close只是固定了ACK1先FIN2后:
- 如果实际运行得时间隔近 就合并三次挥手
- 实际运行得时间距远就分开四次挥手
3.2.2.2【CLOSE_WAIT】
close->把输出缓冲区剩余数据发完->发送FIN2->关闭发送通道=>LAST_ACK
3.2.2.2.1CLOSE_WAIT堆积
后断Socket如果无法正常调用close释放连接,服务器就会出现大量CLOSE_WAIT堆积的现象:
导致连接一直挂着,造成文件描述符和内存泄漏
3.2.2.3【LAST_ACK】
(or1)超时未收到ACK2->重传FIN2,有意义在对方TIME_WAIT状态下能收到的,只有首重传的一次FIN2
(2)收到 对方接收先前发送的FIN2发送的/对方接收首次重传FIN2发送的 ACK2->内核释放所有连接资源=>CLOSED
3.2.2.4【CLOSED】
静止状态:





