第二章
TCP的三路握手、TCP的连续终止序列、TCP的TIME_WAIT状态
概念
IPv4
IPv6
TCP
UDP
SCTP
ICMP
IGMP
ARP
RARP
ICMPv6
BPF
DLPI
RFC Request for Comments 请求评注(文档定义)
RTT round-trip time 客户单和服务器之间的往返时间
UDP 用户数据报协议
RFC 768
UDP不提供确认、序列号、RTT估算、超时和重传机制
不提供流量控制
UDP可以是全双工的
TCP 传输控制协议
RFC 793 RFC 1323 RFC 2581 RFC 2988 RFC 3390
TCP提供客户和服务器之间的连接,TCP客户先与某个给定服务器建立一个连接,再跨该连接与那个服务器交换数据,然后终止这个连接。
TCP给每个分节关联一个序列号 (一轮一轮循环)
分节是TCP传递给IP的数据单元
TCP提供流量控制(flow control)
通告窗口(advertised window) TCP告诉对端在任何时刻它一次能接受多少字节的数据(可用的空间量)
TCP是全双工的(full-duplex)
SCTP 流控制传输协议
RFC 2960 RFC 3309 RFC 3286
SCTP在客户和服务器之间提供关联,像TCP那样给应用提供可靠性、排序、流量控制和全双工的数据传送。一个关联指代两个系统之间的一个通信,它可能因为SCTP支持多宿而不止两个地址。
SCTP是面向消息的,提供各个记录的按序递送服务
提供多宿特性,使得单个SCTP端点能够支持多个IP地址。(多个冗余网络连接,增强健壮性)
类似的健壮性在路由协议的辅助下也可以从TCP中获得。如:iBGP实现同一域内的BGP连接把某个虚拟接口的多个地址作用于TCP连接的端点。
TCP连接的建立和终止
帮助理解connect、accept和close这三个函数,并使用netstat调试TCP应用
三路握手
SYN(同步) -> ACK(确认)
每个SYN可以含有多个TCP选项
MSS选项 通告对端它的最大分节大小(maximum segment size),使用TCP_MAXSEG套接字选项提取和设置。
窗口规模选项 TCP连接的最大窗口大小是65535(相应字段占16位),这个新选项指定TCP首部的通告窗口必须扩大(左移)的位数(0~14),因此提供接近1G(65535x2^14)。前提是两个端系统都需支持这个选项。使用SO_RCVBUF套接字选项设置。
时间戳选项 可以防止失而复现的分组可能造成的数据损坏。类似窗口规模选项的方式协商处理,编程人员无需考虑这个选项。
后两个称为“RFC 1323选项”或“长胖管道选项”
(MTU: Maxitum Transmission Unit 最大传输单元)
(MSS: Maxitum Segment Size 最大分段大小)
http://infotech.blog.51cto.com/391844/123859
TCP连接终止
FIN -> ACK
通常需要4个分节,某些情况下步骤一的FIN随着数据一起发送,步骤二和步骤三发送分节可能被合并成一个分节。
一个Unix进程无论主动(exit,main函数返回)被动(收到进程终止信号)终止时,打开的描述符都被关闭,打开的TCP连接上也发出一个FIN。
TCP状态转换图
TCP为一个连接定义了11种状态。
(在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG. 其中,对于我们日常的分析有用的就是前面的五个字段。 它们的含义是: SYN表示建立连接, FIN表示关闭连接, ACK表示响应, PSH表示有 DATA数据传输, RST表示连接重置。)
最长分节生命期(maximum segment lifetime,MSL) MSL是任何IP数据包能够在因特网中存活的最长时间。停留在TIME_WAIT状态的持续时间是MSL的两倍,称为2MSL。(一般是30秒)
每个数据包含有一个称为跳限(hop limit)的8位字段。最大值为255.具有最大跳限的分组在网络中存在的时间不可能超过MSL秒。
2.9 端口号
TCP/UDP/SCIP这三种传输层协议都使用16位整数的端口号(port number)来区分进程。
RFC 1700 RFC 3232
0 ~ 1023 由IANA分配和控制
1024 ~ 49151 已登记的端口
49152 ~ 65535 动态的或私有端口 临时端口
标识每个端点的两个值(IP地址和端口号)通常称为一个套接字。
2.10 TCP端口号与并发服务器
2.14 小结