TCP/IP的ICMP协议,端口号,TCP建立连接的3次握手
- ICMP协议(Internet Control Message Protocol)
1.1. 定义:用于主机或路由器向源点发送差错信息或查询信息的协议。
1.2. 报文结构
IP首部(20个字节) |
||
报文类型(2个字节) |
报文字段(2个字节) |
校验和(4个字节) |
|
||
ICMP报文内容(长度取决于ICMP报文的类型) 注:这里前八个字节为IP数据包的前八个字节,他们包含了应用程序在源目的主机上的端口号。 |
1.3. 报文类型
发生报文的情形分为2大类,错误报告和查询报告。每一个大类下面又有很多不同情形的小类,每种情形的小类还有不同的错误响应。
1.3.1. 错误报告
在终点不可到达,源点抑制(拥赛),时间超时(TTL),参数问题(IP首部字段错误),改变路由(路径的改变)的情况下会向源主机发送差错报告。
1.3.2. 查询
主要用于回送请求和响应(判断是否可到达),时间戳请求和问答(时间同步)的这个两种情况。
1.4. ICMP举例
1.4.1. Ping
判断目的主机是否可到达。
1.4.2. Tracert
显示到达目的主机要经过的路由路径。
2.TCP(Internet Control Message Protocol)
2.1. 端口号
产生的背景:在TCP/IP分层中,应用层的各个应用程序的进程可以在同一个传输层上发送和接收应用数据。应用层的应用程序进程可以把应用数据传递个同一个传输层。但传输层从网络层接收到数据后,它如何才能把这个数据传送给对应的应用层的应用程序?
举个例子:现在的应用层的程序进程有http,ftp,SVN等3个应用程序,他们都可以向传输层传递应用数据,应用层不需要知道是那个应用程序。现在,有一个SVN的应用数据到达了应用层,传输层就把应用数据传输给了SVN应用程序,问题来了,这时传输层怎么知道把SVN的应用数据传输给SVN应用程序,而不是给其它的应用程序http,ftp呢?
在TCP/IP协议中,为了能让传输层在传递数据给应用层的应用程序时,能区分各个应用程序,就在IP数据报里面定义了一个端口号,传输层就IP数据包的端口号把应用数据传输给对应的应用层的应用程序。
端口号是一个软端口与路由器的硬件端口不同,它是依赖于一台主机的。在不同的主机上可以有相同的端口号,但在同一个主机上不能有相同的端口号。
2.1.1. 划分
关于端口的划分,先要明白服务端和客户端这两个概念。在通信过程中,主动打开连接的应用叫做客户端,被动打开连接的应用叫做服务端。
1) 服务端口
客户端要与服务端进行通信,那么久必须要知道服务端的端口号。该服务端程序一直进行监听端口的数据,该端口必须一直打开。
有些应用程序的端口是著名端口,比如FTP。
2) 暂时端口
客户端要与服务端进行通信时连接时,在客户端主机上随机登记一个没有被使用的端口号,当客户端断开连接时,就注销该端口号。也就是收该端口是暂时的,不是长久打开的。
2.2. 建立连接
客户端要和服务端建立连接时需要经过1次请求和2次确认(所谓的3次握手)。
1) 客户端向服务端发送建立连接请求
2) 服务端收到客户端的建立连接请求后,如果允许建立连接,那么就响应客户端同意建立连接。
3) 客户端收到服务端的同意建立连接的响应后就行服务端发送建立连接确认报文。
注:为什么需要3)步,是为了防止“已失效的建立连接请求”。
产生已失效的建立建立连接请求的情形。
客户端向服务端发送了一个建立连接请求报文,但该报文由于路由的拥挤,没有在响应时间内到达服务端,那么这时客户端没有收到服务端建立连接的确认报文,那么久认为服务端拒绝建立连接。但是建立连接请求报文过段时间后又到达了服务端,服务端同意建立连接,就向客户端发送“同意建立连接”报文,客户端可能由于连接没有建立那么就关闭了,或者客户端由于没有发送新的连接请求报文,就会拒绝服务端的报文。这时服务端就会一直监听没有建立成功的连接,造成了服务资源的浪费/。在这种情形下这,服务端收到的建立连接请求报文就为“已失效的建立连接请求”报文。