OSI7层模型与TCP/IP模型(DOD)对应关系
TCP/IP协议簇相关协议汇总
应用层协议介绍
FTP 21 明文协议,文件传输协议,基于TCP
TFTP 69 简单文件传输协议,基于UDP
SSH 22 安全外壳协议,远程连接,加密4
Telnet 23 明文协议,远程连接
SNMP 161/162 简单网络管理协议,基于UDP
SMTP 25 简单邮件传输协议,基于TCP
HTTP 80 超文本传输协议
HTTPS 443 超文本传输安全协议
DHCP 67/68/546 动态主机设置协议,C(67),S(68),546(V6)
主机到主机层协议介绍
TCP: 传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。
特点:面向连接,可靠,传输效率低
应用场景:web浏览器,电子邮件,文件传输程序
外卖员-->快递必须送到我们的手中
UDP: 用户数据报协议,属于无连接的传输协议
特点:无连接、不可靠、快速传输
应用场景:域名系统(DNS),视频流,IP语音(VOIP)
外卖员-->快递放在门口
TCP UDP协议端口号范围 1 - 65535 (可以的),真正端口号总数为2的16次方=65536
面向连接:是指通信双方在通信时,要事先建立一条通信线路,其有三个过程:建立连接、使用连接和释放连接。
面向无连接:是指通信双方不需要事先建立一条通信线路,而是把每个带有目的地址的包(报文分组)送到线路上,由系统自主选定路线进行传输。
TCP协议的十一种状态集转换
客户端发送FIN给服务端-->ESTABLISHED-->FIN_WAIT1第一次等待
服务端收到回复ACK: ESTABLISHED--->CLOSED_WAIT关闭等待
收到后客户端:FIN_WAIT1-->FIN_WAIT2第二次等待
服务端继续回复客户端FIN: CLISED_WAIT--->LAST_ACK
客户端回复确认ACK:FIN_WAIT2-->TIME_WAIT时间等待-->CLOSED状态
最后服务端收到确认ACK: LAST_ACK---> CLOSED
各个状态的意义如下:
CLOSED:初始状态,表示TCP连接是“关闭着的”或“未打开的”。
LISTEN :表示服务器端的某个SOCKET处于监听状态,可以接受客户端的连接。
SYN_RCVD :表示服务器接收到了来自客户端请求连接的SYN报文。在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,基本上用netstat很难看到这种状态,除非故意写一个监测程序,将三次TCP握手过程中最后一个ACK报文不予发送。当TCP连接处于此状态时,再收到客户端的ACK报文,它就会进入到ESTABLISHED状态。
SYN_SENT :这个状态与SYN_RCVD状态相呼应,当客户端SOCKET执行connect()进行连接时,它首先发送SYN报文,然后随即进入到SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。
ESTABLISHED :表示TCP连接已经成功建立。
FIN_WAIT_1 :这个状态得好好解释一下,其实FIN_WAIT_1和FIN_WAIT_2两种状态的真正含义都是表示等待对方的FIN报文。而这两种状态的区别是:FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态。当然在实际的正常情况下,无论对方处于任何种情况下,都应该马上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态有时仍可以用netstat看到。
FIN_WAIT_2 :上面已经解释了这种状态的由来,实际上FIN_WAIT_2状态下的SOCKET表示半连接,即有一方调用close()主动要求关闭连接。注意:FIN_WAIT_2是没有超时的(不像TIME_WAIT状态),这种状态下如果对方不关闭(不配合完成4次挥手过程),那这个FIN_WAIT_2状态将一直保持到系统重启,越来越多的FIN_WAIT_2状态会导致内核崩溃。
TIME_WAIT :表示收到了对方的FIN报文,并发送出了ACK报文。TIME_WAIT状态下的TCP连接会等待2*MSL(Max Segment Lifetime,最大分段生存期,指一个TCP报文在Internet上的最长生存时间。每个具体的TCP协议实现都必须选择一个确定的MSL值,RFC 1122建议是2分钟,但BSD传统实现采用了30秒,Linux可以cat /proc/sys/net/ipv4/tcp_fin_timeout看到本机的这个值),然后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。(这种情况应该就是四次挥手变成三次挥手的那种情况)
CLOSING :这种状态在实际情况中应该很少见,属于一种比较罕见的例外状态。正常情况下,当一方发送FIN报文后,按理来说是应该先收到(或同时收到)对方的ACK报文,再收到对方的FIN报文。但是CLOSING状态表示一方发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什么情况下会出现此种情况呢?那就是当双方几乎在同时close()一个SOCKET的话,就出现了双方同时发送FIN报文的情况,这是就会出现CLOSING状态,表示双方都正在关闭SOCKET连接。
CLOSE_WAIT :表示正在等待关闭。怎么理解呢?当对方close()一个SOCKET后发送FIN报文给自己,你的系统毫无疑问地将会回应一个ACK报文给对方,此时TCP连接则进入到CLOSE_WAIT状态。接下来呢,你需要检查自己是否还有数据要发送给对方,如果没有的话,那你也就可以close()这个SOCKET并发送FIN报文给对方,即关闭自己到对方这个方向的连接。有数据的话则看程序的策略,继续发送或丢弃。简单地说,当你处于CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。
LAST_ACK :当被动关闭的一方在发送FIN报文后,等待对方的ACK报文的时候,就处于LAST_ACK状态。当收到对方的ACK报文后,也就可以进入到CLOSED可用状态了。