Unix Network Programming

问题

程序异常终止

此时所有打开的文件描述符将被关闭,TCP 连接发送一个 FIN 。然后呢?对端的确认报文是否收到无所谓? 对端发送 FIN 报文,此时已经终止?无法恢复确认报文?对端会重复发送?

IP 分片(fragment) – TCP 分段

MTU : 最大传输单元

链路层对网络数据帧的一个限制:以太网限制 MTU 为 1500 字节。 尽管 IP 报文头中有 16 位表示数据报的长度(最大长度 216-1=65535) IP 报文的长度超过 MTU 就需要分片,IP 数据报的分片与重组都是在网络层完成的。 IP 头有 3 个标志位,一个标志位保留;一个标志位 DF 表示是否允许分片,为 0 表示允许分片,为 1 表示禁止 分片,当报文长度大于 MTU 则丢弃该报文,并向源主机发送 ICMP 报文;一个标志位 MF 表示之后是否还有分片 片偏移用于确定该片偏移原始数据报开始处的位置。 16 位标识用于确定相应的片是否属于同一个 IP 报文。 每个以太帧长度在 64 bytes ~ 1518 bytes,减去以太网帧头(DMAC 48bits=6Bytes + SMAC 48bits=6Bytes + Type 2Bytes + CRC 4Bytes)最大只能有 1500 bytes。链路层数据部分长度的要求是 46bytes ~ 1500bytes

MSS : 最大报文段长度

一般 MSS 为 MTU 减去 IP 首部长度 20 字节和 TCP 首部长度 20 字节,1500-40-40=1460 。但是许多 BSD 实现 版本需要 MSS 为 512 的倍数,所以一般 MSS 都是 1024。当建立一个 TCP 连接时,每一方都通告其期望的 MSS 选项(MSS 选项只能出现在 SYN 报文段中),最终选择两者中的较小者作为 MSS,是一个协商选项。 TCP 报文段的分段与重组是在运输层完成的。

不希望 IP 分片的原因

对于 IP 分片的数据报,即使丢失一片数据,也要重传整个数据报。因为 IP 层没有重传机制,没有办法只重传某 一片。所以即使 IP 分片过程看起来是透明的,但人们仍然不想用它。所以 TCP 总是避免分片,通过设置 MSS 使 得以太网帧长度不超过 MTU

TCP、UDP 与 IP 分片

UDP 很容易导致分片; TCP 试图避免分片,应用程序几乎不可能强迫 TCP 发送一个需要分片的报文。

CSMA/CD

CSMA/CD是Carrier Sense Multiple Access with Collision Detection 的缩写, 可译为“载波侦听多路访问/冲突检测”,或“带有冲突检测的载波侦听多路访问”。 所谓载波侦听(carrier sense),意思是网络上各个工作站在发送数据前都要侦听总线上有没有数据传输。 若有数据传输 (称总线为忙),则不发送数据;若无数据传输(称总线为空),立即发送准备好的数据。 所谓多路访问(multiple access)意思是网络上所有工作站收发数据共同使用同一条总线,且发送数据是广播式的。 所谓冲突(collision),意思是,若网上有两个或两个以上工作站同时发送数据,在总线上就会产生信号的混合, 两个工作站都同时发送数据,在总线上就会产生信号的混合,两个工作站都辨别不出真正的数据是什么。 这种情况称数据冲突又称碰撞。为了减少冲突发生后的影响。工作站在发送数据过程中还要不停地检测自己发送的 数据,有没有在传输过程中与其它工作站的数据发生冲突,这就是冲突检测(collision detected)。

IPG(Inter-Packet Gap) Preamble Start Frame Delimiter DMAC SMAC Type Data Frame check Sequence
12Bytes 7Bytes 1Bytes 6Bytes 6Bytes 1Byte 48~1500Bytes 4Bytes
  AA (01010101) AB (01010011)          
帧间隙 前导码 前导码-帧界定符          

CSMA/CD媒体访问控制方法的工作原理,可以概括如下: 先听后说,边听边说; 一旦冲突,立即停说; 等待时机,然后再说; 注:“听”,即监听、检测之意;“说”,即发送数据之意。 CSMA/CD网络上进行传输时,必须按下列五个步骤来进行 (1)传输前监听 (2)如果忙则等待 (3)如果空闲则传输并检测冲突 (4)如果冲突发生,重传前等待 (5)重传或夭折 主要参数: 时间片 51 2比特时间 帧间间隔 9.6 微秒 尝试极限 16 退避极限 10 人为干扰长 32 比特 最大帧长 1518 字节 最小帧长 64 字节 地址字段长 48 比特 二进制指数退避算法 1)确定基本退避时间(基数),一般定为2τ,也就是一个争用期时间,对于以太网就是51.2μs 2)定义一个参数K,为重传次数,K=min[重传次数,10],可见K≤10 3)从离散型整数集合[0,1,2,……,(2k-1)]中,随机取出一个数记做R 那么重传所需要的退避时间为R倍的基本退避时间:即:T=R×2τ。 4)同时,重传也不是无休止的进行,当重传16次不成功,就丢弃该帧,传输失败,报告给高层协议

TIMEWAIT 状态

TCP 建立连接

将 TCP 连接比作一个电话系统: socket 函数表示拿到一个电话; bind 函数告诉别人你的电话号码,这样对方才可以呼叫你; listen 函数打开电话的振铃,有来电的时候可以听到; accept 函数应答电话,同时返回呼叫者的电话号码(IP、Port)。且只在建立连接之后才能返回。 getaddrinfo 在电话簿上查询某人的电话号码。(DNS 查询),getnameinfo 电话簿按照电话号码排序

TCP 状态转换图

TCP 建立连接和连接终止的操作可以用状态转换图(state transition diagram)来表示。 TCP 为一个连接定义了 11 中状态,且规定如何基于当前状态以及在该状态下所接收的分节来确定下一个状态。

TIMEWAIT

TIMEWAIT 的时间是 2MSL (maximum segment lifetime) ,也就是肯定会在这个状态等待这么长时间。 TCP 不给处于 TIMEWAIT 状态的连接建立新连接。保证每建立一个新 TCP 连接,来自该连接先前化身的老的重复 分组都已在网络中消逝了。

存在理由

  1. 可靠的实现 TCP 全双工连接的终止;
  2. 迟到的报文被丢弃。
0%