IP地址和IP协议
- 规定网络地址的协议叫ip协议,它定义的地址称之为ip地址,广泛采用的v4版本即ipv4,它规定网络地址由32位2进制表示
- 范围0.0.0.0-255.255.255.255
- 一个ip地址通常写成四段十进制数,例:192.168.1.10
- a类网 10.0.0.0~10.255.255.255
- b类网 172.16.0.0~172.31.255.255
- c类网 192.168.0.0~192.168.255.255
端口
- 只有一个IP地址是不行的,因为IP 地址与网络服务的关系是一对多的关系。实际上是通过“IP地址+端口号”来区分不同的服务的。IP找到对应主机,端口找到主机中某一个服务。
- 端口号不是随意使用的,而是按照一定的规定进行分配。
- 端口的分类标准有好几种,最主要的是知名端口和动态端口。
- 知名端口的范围从0到1023(1024个端口都是操作系统会使用的比较大的端口)。例如:80端口分配给HTTP服务、21端口分配给FTP服务。
- 一般情况下,如果一个程序需要使用知名端口的需要有root权限
动态端口(Dynamic Ports)
- 动态端口的范围是从1024到65535
- 它一般不固定分配某种服务,而是动态分配。
- 动态分配是指当一个系统程序或应用程序程序需要网络通信时,它向主机申请一个端口,主机从可用的端口号中分配一个供它使用。当这个程序关闭时,同时也就释放了所占用的端口号。
MAC地址
- 每块网卡出厂时都被烧制上一个世界唯一的mac地址,长度为48位2进制。
- 通常由12 位16进制数表示(前六位是厂商编号,后六位是流水线号) 。
TCP协议
- TCP——传输控制协议,是因特网中的传输层协议,提供的是面向连接、较高可靠的字节流服务。
- TCP将在服务器和客户端之间建立一个全双工 (full-duplex) 的通信。
-
TCP提供 超时重发 、丢弃重复数据、检验数据、流量控制等功能,保证数据能从一端传到另一端。
-
TCP建立一个连接需要三次握手,终止一个连接要经过四次挥手,这是由TCP的半关闭(half-close)造成的。
-
应用:Web浏览器;电子邮件、文件传输程序。
在串行通信中,数据通常是在两个终端(如电脑和外设)之间进行传送,根据数据流的传输方向可分为3种基本传送方式:单工、半双工和全双工。1. 单工:只有一根数据线,通信是单方向上进行。例如:监视器、打印机、电视机等。2. 半双工:只有一根数据线,此数据线既可发送也可接收,可以在两个方向进行,但通信双方不能同时收发数据。注:在这儿,每当一方完成命令后都要切换状态,并告知对方可以进行操作,否则就会出错。3. 全双工:两根不同的数据线,通信双方可以在同一时刻进行发送和接收。例如:打电话。
前置~~~
- 序号(sequence number):seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
- 确认号(acknowledgement number):ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。
- 标志位(Flags):共6个,即URG、ACK、PSH、RST、SYN、FIN等。具体含义如下:
URG:紧急指针(urgent pointer)有效。
ACK:确认序号有效。(为了与确认号ack区分开,我们用大写表示)
PSH:接收方应该尽快将这个报文交给应用层。
RST:重置连接。
SYN:发起一个新连接。
FIN:释放一个连接。
三次握手
各字段的作用:
SYN | ACK | seq | ack |
建立连接 | 确认收到了请求 | 发送自己的数据 | 发送接收到的对方的数据 |
首先聊天式的理解下:
第一次握手: 客户端->服务器 “请求连接 + 我能发送”
SYN = 1 ,seq = x
你能和我连接吗?可以接收到我的数据吗?
第二次握手: 服务器->客户端 “回复连接 + 我能收到 + 我能发送 + 询问核实”
SYN = 1 ,ACK = 1 ,seq = y ,ack = x + 1
我可以建立连接,我接收到了你的请求,你能接收我的数据吗?这是你的数据吗?
第三次握手: 客户端->服务器 “我能收到 + 回复询问 + 再次询问核实”
ACK = 1 ,seq = x + 1 ,ack = y + 1
我收到了你的回复,这是我的数据,这是你的数据吗?
下面则是官方性的描述:
- 最开始的时候客户端和服务器都是处于CLOSED关闭状态。主动打开连接的为客户端,被动打开连接的是服务器。
- 服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了 LISTEN 监听状态。
- 第一次握手:客户端先创建传输控制块TCB,然后向服务器发出连接请求报文,这时报文首部中的同部位SYN=1,同时选择一个初始序列号 seq=x ,此时,客户端进程进入了 SYN-SENT 同步已发送状态。
- 第二次握手:服务器收到请求报文后,如果同意连接,则会向客户端发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己初始化一个序列号 seq=y,此时,服务器进程进入了 SYN-RCVD 同步收到状态。
- 第三次握手:客户端收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,自己的序列号seq=x+1,此时,TCP连接建立,客户端进入ESTABLISHED已建立连接状态触发三次握手。
四次挥手
第一次挥手: 客户端->服务器 “请求断开 + 我要断开”
FIN = 1 ,seq = u
我能和你断开吗?我想要断开。
第二次挥手: 服务器->客户端 “我能收到 + 我要断开 + 同意断开”
ACK = 1 ,seq = v ,ack = u + 1
我接收到了你的消息,我也想要断开,没问题你走吧。
第三次挥手: 服务器->客户端 “请求断开 + 我能收到 + 我要断开 + 再次同意断开”
FIN = 1 ,ACK = 1 ,seq = w ,ack = u + 1
我可以和你断开,我收到了你的消息,那就不见了,你走吧。
第四次挥手: 客户端->服务器 “我能收到 + 我彻底断开 + 再次同意断开”
ACK = 1 ,seq = u + 1 ,ack = w + 1
我收到了你的消息,我断开了,那就不见了。
- 数据传输完毕后,双方都可释放连接。最开始的时候,客户端和服务器都是处于ESTABLISHED状态,然后客户端主动关闭,服务器被动关闭。
- 第一次挥手:客户端发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。
- 第二次挥手:服务器端接收到连接释放报文后,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT 关闭等待状态。
- 第三次挥手:客户端接收到服务器端的确认请求后,客户端就会进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文,服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
- 第四次挥手:客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态,但此时TCP连接还未终止,必须要经过2MSL后(最长报文寿命),当客户端撤销相应的TCB后,客户端才会进入CLOSED关闭状态,服务器端接收到确认报文后,会立即进入CLOSED关闭状态,到这里TCP连接就断开了,四次挥手完成。
- 为什么客户端要等待2MSL?
为保证客户端发送的第一个ACK报文能到达服务器,因为这个ACK报文可能丢失,并且2MSL是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃,这样新的连接中不会出现旧连接的请求报文。
UDP协议
- UDP——用户数据报协议,是一个简单的面向数据报(报文)的传输层协议。
- UDP提供的是不可靠的、无连接的服务。只把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。
- UDP不用在在传输数据报前给客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输效率高(发送前时延小)。
-
特点:一对一、一对多、多对一、多对多、尽最大努力服务, 无拥塞控制 。
-
应用:域名系统 (DNS);视频流;IP语音(VoIP)。