tcp要点总结之链接篇

TCP 三次握手

sequenceDiagram
client->>server: SYN J
server->>client: SYN k, ack J+1
client->>server: ACK k+1(may have data)

每一个SYN可以含有多个TCP选项,下面是常用的TCP选项

  • MSS 发送 SYN 的TCP一端使用本选项通告对端它的最大分节大小,也就是它在本次链接每个TCP分节中愿意接受的最大数据量
  • 窗口规模选项(流量控制)最大大小是65535 bit(2^16)
  • 时间戳选项

所以如果要修改 socket 缓冲之类的信息的话,必须在connect之前进行设置,因为一旦进入三次链接之后, 所有的buffer值都已经固定下来了,无法进行更改

四次挥手

sequenceDiagram
client->>server: FIN M
server->>client: ACK M + 1
server->>client: FIN N
client->>server: ACK N + 1
  • 如果某个应用进程在接收到一个FIN之前调用close(主动关闭)那就转换成FIN_WAIT状态,但如果某个应用在established状态期间收到了一个FIN(被动状态)就转换到CLOSE_WAIT 状态
四次挥手状态转换
sequenceDiagram
FIN_WAIT->>CLOSE_WAIT: FIN M (fin_wait1)
CLOSE_WAIT->>FIN_WAIT: ACK M + 1(fin_wait2)
TIME_WAIT->>LAST_ACT: FIN N
TIME_WAIT->>LAST_ACT: ACK N + 1 (last_act to close)
TIME_WAIT 详解

存在理由

  1. 可靠的实现TCP全双工链接的终止
  2. 允许老的重复分节在网络中消失
  • 第一点, 假如最后的ack在网络中丢失,服务端将重新发送 FIN,所以客户端必须在发送ack之后继续维护一段时间的状态信息以便重新发送给服务端的ack

  • 我们可以看到,主动关闭的那端经历了这个状态,该端点停留在这个状态的持续时间是最长分节生命期(maximum segment lifetime)的两倍。 我们假设 在 12.106.32.254:1500 和 206.168.112.219:21 之前有一个TCP链接,我们关闭这个链接,过一段时间之后在相同的ip地址和端口之间建立另一个链接。后一个链接被称为前一个链接的incarnation,这里TIME_WAIT 的作用就是防止来自某个老的重复分组在该链接已经终止后再现,从而被误解成新的化身发来的请求,TIME_WAIT 可以保证所有老的链接的分组都在网络中消逝

msl 是任何ip数据报在网络中存活的最长时间(跳限)

TCP socket

RST: 若对客户的SYN的响应是RST(表示复位), 则表明该服务器主机在我们指定的端口上没有进程在等待与之链接

  • listen:当socket函数创建一个socket时,socket被假设为一个主动链接的socket,也就是说,它将是一个调用connect发起链接的客户端socket, listen 函数将一个未连接的socket转换成一个被动socket(监听套接字)

  • 内核为任意一个监听socket维护两个队列

    • 未完成链接队列(SYN_RCVD)
    • 已完成链接队列(ESTABLISHED)

收到SYN,新创建一个链接socket,并将socket放入未完成队列中,当三次握手结束后, 将socket从未完成队列放入已完成队列中

  • accept: 从已完成队列中取出socket 进行数据传输

(csdn不支持画图。。悲剧

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值