21.TCP状态机。
网络上的传输是没有连接的,包括TCP也是一样的。而TCP所谓的"连接",其实是由通讯的双方维护一个"连接状态",让它看上去好像有连接一样。所以,TCP的状态变换是非常重要的。
下面是TCP协议的状态机
下面是 "TCP建链接"、"传数据"、"TCP断链接" 的对照图:
22.三次握手的过程与建立连接时需要注意的要点。
连接建立过程中要解决以下三个问题:
(1)要使每一方能够确知对方的存在。
(2)要允许双方协商一些参数(如最大报文段长度,最大窗口大小,服务质量等)。
(3)能够对运输实体资源(如缓存大小,连接表中的项目等)进行分配。
TCP连接的建立都是采用客户服务器方式。
主动发起连接建立的应用进程叫做客户(client)。被动等待连接建立的应用进程叫做服务器(server)。
需要注意的问题:
(1)关于ISN。3次握手的过程中会初始化Sequence Number 的初始值。通信的双方要互相通知对方自己的初始化的seq(缩写为ISN:Inital Sequence Number)。也就上图中的x和y。这个号作为以后的数据通信的序号,以保证应用层接收到的数据不会因为网络上的传输的问题而乱序(TCP会用这个序号来拼接数据)。ISN是不能硬编码的,否则会出问题。比如连接建好后始终用1来做ISN,如果client发了30个字节过去,但是网络断了,于是client重连后又用了1做ISN,但是之前连接的那些包到了,于是就被当成了新连接的包,此时client的seq=3,而Server端认为client端的seq=30了,这样就会出现错误。RFC793中描述了ISN会和一个假的时钟绑在一起,这个时钟会在每4微秒对ISN做加一操作,直到超过232后又从0开始。这样一个ISN的周期大约是4.55个小时。只要TCP报文段在网络上的存活时间MSL(Maximum Segment Lifetime)不超过4.55小时,那么就不会发生ISN重用。
(2)关于建连接时SYN超时。试想如果server端接到了client发送的SYN且回复了SYN-ACK后client掉线了,server端没有收到client回来的ACK,那么这个连接处于一个中间状态,既没成功也没失败。于是server端如果在一定时间内没有收到的TCP会重发SYN-ACK。在Linux下,默认重试次数为5次,重试的间隔时间从1s开始每次都翻倍,5次的重试时间间隔为1s, 2s, 4s, 8s, 16s,总共31s,第5次发出后还要等32s都知道第5次也超时了,所以总共需要 1s + 2s + 4s+ 8s+ 16s + 32s = 26 -1 = 63s,TCP才会把这个连接断开。
(3)关于SYN Flood攻击。利用SYN超时的行为,可以进行SYN Flood攻击,即给服务器发送一个SYN后就下线,服务器默认需要等待63s才会断开连接,这样攻击者就可以把服务器SYN连接的缓存队列耗尽,使之不能处理正常的连接请求。Linux下给出了参数tcp_syncookies来应对这个问题,当SYN队列满后,TCP会通过源地址端口、目标地址端口和时间戳生成一个特别的seq值发回去(又叫cookie),如果是攻击者或已掉线的主机则不会有响应,如果是正常连接则会把这个 SYN Cookie在ack字段中发回来,然后服务端即可与其建立连接。请注意,请不要优先使用tcp_syncookies来处理正常的大负载连接情况,因为syncookies是妥协版的TCP协议,并不严谨。
(4)对于正常的大负载情景,有三个TCP参数可供选择。
第一个是:tcp_synack_retries,用来设置重试次数,可将重试次数减少;
第二个是:tcp_max_syn_backlog,用来设定SYN缓存队列大小,可以增大同时存在的SYN连接数;
第三个是:tcp_abort_on_overflow,可以使服务器在处理不过来时直接拒绝连接。
23.四次挥手的过程与结束过程各个状态的要点。
因为TCP是全双工的,所以发送方和接收方都需要FIN和ACK,即挥手2次,所以共有4次挥手。
结束过程可能出现6种状态(上图出现5种)。分别是:
FIN-WAIT-1 等待被动端TCP的FIN请求,或先前的发送FIN请求的ACK回应;
FIN-WAIT-2 等待被动端TCP的FIN请求;
CLOSE-WAIT 等待应用程序发送最后的数据,并在之后向主动端发送FIN;
LAST-ACK 等待主动端对被动端FIN请求的ACK回应;
TIME-WAIT 等待一定的时长,2MSL后主动端才能真正释放连接;
CLOSING 等待对端TCP对己端FIN的ACK回应,此时双方对等,不区分主被动。
如果双方同时断连接,就都会进入到CLOSING状态,并且双方都会在之后进入TIME_WAIT状态。下图是双方同时断连接的示意图:
需要注意的问题:
(1)关于 MSL 和 TIME_WAIT。在结束过程中,从TIME_WAIT状态到CLOSED状态时,有一个计时器,这个计时器设置为2*MSL(RFC793定义了MSL为2分钟,Linux设置成了30s)这样做主要有两个原因:1)TIME_WAIT期间,主动端可以确保有足够的时间让对端收到了ACK,如果被动端没有收到ACK,就会触发重传FIN,一来一去正好2个MSL;2)有足够的时间让这个连接不会跟后面的连接混在一起,有些路由器会缓存IP数据包,如果连接被重用了,那么这些延迟收到的包就有可能会跟新连接的数据包混在一起。
(2)关于TIME_WAIT数量太多。TIME_WAIT是个很重要的状态,但是如果在大并发短链接的场景下,TIME_WAIT就会太多,这也会消耗很多系统资源。Linux下存在参数tcp_max_tw_buckets,描述控制并发的TIME_WAIT的数量,默认值是180000,超限后系统会把多余的TIME_WAIT销毁,官网文档描述这个参数是用来对抗DDoS攻击的,并且认为默认值180000并不小,需要根据实际情况考虑。
另外网络上常见的,使用参数tcp_tw_reuse和tcp_tw_recycle来解决TIME_WAIT数量太多的问题是非常危险的,因为这两个参数违反了TCP协议。
另外,只有主动断开连接的一方才会进入TIME_WAIT状态,所以如果让对端断连接,那么TIME_WAIT数量的问题就是对方的了。
24.使用TCP协议的常见应用层协议
端口号 协议名称 缩写 英文全称
20, 21 文件传输协议 FTP File Transfer Protocol
22 安全壳 SSH Secure Shell
23 远程登录协议 Telnet -
25, 465 简单邮件传输协议 SMTP Simple Mail Transfer Protocol
80 超文本传输协议 HTTP Hypertext Transfer Protocol)
110, 995 邮局协议-版本3 POP3 Post Office Protocol - Version 3
143, 993 互联网邮件访问协议 IMAP Internet Mail Access Protocol
443 超文本传输安全协议 HTTPS Hypertext Transfer Protocol Secure
445 信息服务块 SMB Server Message Block
25.IPv6相关知识
IPv6(Internet Protocol version 6)互联网通信协议第6版是互联网协议的最新版本,用于数据包交换互联网络的网络层协议,旨在解决IPv4地址枯竭问题。IPv6意图取代IPv4,但IPv4在仍然在网络上占有较大份额。在大多数情况下,IPv6仅仅是对IPv4的一种保守扩展,大多数传输层和应用层协议几乎不怎么需要修改就可以工作在IPv6上。
NAT是目前减缓IPv4地址耗尽最有效的方式,而IPv6的地址消除了对它的依赖,并被认为足够在可以预测的未来使用。IPv6具有比IPv4大得多的编码地址空间。因为IPv6采用了128位的地址,其地址空间可支持2128个地址。IPv6地址一般由两个逻辑部分组成:一个64位的网络前缀和一个64位的主机地址,主机地址通常根据物理地址自动生成。
IPv6地址的长度为128位二进制数,以16位为一组,每组以冒号隔开,可以分为8组。一般每组以4位十六进制数表示,因此一遍可以表示为32个十六进制数。例如:
2006:0db8:85a3:08d3:13c9:8a2e:0370:7344是一个合法的IPv6地址。
IPv6地址在某些条件下可以使用省略记法,以下是省略规则:
1)每组中前导的数字0可以省略,省略后前导数字仍是0则继续;
2)可以用双冒号"::"表示一组0或多组连续的0,但只能出现一次。
例如,以下的IPv6地址是相等的:
2001:0db8:02de:0000:0000:0000:0000:ae13
2001:db8:2de:000:000:000:000:ae13
2001:db8:2de:0:0:0:0:ae13
2001:db8:2de::ae13
注意双冒号只能出现一次,有的省略记法是错误的,因为双冒号出现两次。下面这个IPv6是非法的:
2001::25de::cade
因为它有可能是下种情形之一,造成无法推断。
2001:0000:0000:0000:0000:25de:0000:cade 2001:0000:0000:0000:25de:0000:0000:cade
2001:0000:0000:25de:0000:0000:0000:cade 2001:0000:25de:0000:0000:0000:0000:cade
26.计算机网络中的常见缩写
缩写 英文全称 备注
ACK Acknowledge TCP状态标志,确认
ack Acknowledge TCP确认号字段
ARP Address Resolution Protocol 地址解析协议
ARQ Automatic Repeat-reQuest 滑动窗口的原理
BGP Border Gateway Protocol 边际网关协议
CIDR Classless Inter Domain Routing 无分类域间路由
CRC Cyclical Redundant Check 循环冗余检验
cwnd Congestion Window 拥塞窗口
D-ACK Duplicated ACK 重复确认(3次)
DHCP Dynamic Host Configuration Protocol 动态主机配置协议
DNS Domain Name System 域名系统
D-SACK Duplicated SACK 重复选择确认
FIN Finish TCP状态标志,结束
FTP File Transfer Protocol 文件传输协议
HTTP Hyper Text Transfer Protocol 超文本传输协议
ICMP Internet Control Message Protocol 互联网控制消息协议
IETF Internet Engineering Task Force 互联网工程任务组
IGMP Internet Group Management Protocol 互联网组管理协议
IMAP Internet Mail Access Protocol 互联网邮件访问协议
IP Internet Protocol 互联网通信协议
ISN Initial Sequence Number 初始序列号
MAC Medium Access Control 介质访问控制
MSL Maximum Segment Lifetime 最大报文生存时间
MSS Maximum Segment Size 最大报文长度
MTU Maximum Transmission Unit 最大传输单元
NAT Network Address Translation 网络地址转换
OSI Open System Interconnection 开放式系统互联参考模型
OSPF Open Shortest Path First 开放式最短路径优先
PING Packet Inter Net Groper 网络间包探测器
POP3 Post Office Protocol Version 3 邮局协议-版本3
PPP Point to Point Protocol 点对点协议
PSH Push TCP状态标志,推送
RARP Reverse ARP 反向地址解析协议
RFC Request For Comments 征求修正意见书
RIP Routing Information Protocol 内部网关协议
RST Reset TCP状态标志,重置
RTO Retransmission Time Out 重传超时时限
RTT Round Trip Time 往返时延
SACK Selective ACK 选择性确认
seq Sequence TCP 序号字段
SMB Server Message Block 信息服务块
SMTP Simple Mail Transfer Protocol 简单邮件传送协议
SNMP Simple Network Management Protocol 简单网络管理协议
SRTT Smoothed RTT 平滑后的往返时延
SSH Secure Shell 安全壳
ssthresh Slow Start Threshold 慢开始门限
SYN Synchronize TCP状态标志,同步
TCP Transmission Control Protocol 传输控制协议
TFTP Trivial File Transfer Protocol 简单文件传输协议
TTL Time To Live 生存时间
UDP User Datagram Protocol 用户数据报协议
URG Urgent TCP状态标志,紧急
ZWP Zero Window Probe 零窗口探测
参考:
1.计算机网络(第5版),谢希仁。电子工业出版社,2008.1。以及本教材配套课件。
2.《TCP的那些事》,陈皓。
http://coolshell.cn/articles/11564.html,http://coolshell.cn/articles/11609.html
3.维基百科(Wikipedia)和百度百科词条。
第一部分:计算机网络知识点复习(一)
第二部分:计算机网络知识点复习(二)