功不唐捐【基础篇】——TCP/IP协议

来源:互联网 发布:怎么注册手机域名 编辑:程序博客网 时间:2024/05/20 19:29

  • TCPIP分层
    • 四层模型
    • 通信过程
  • TCP的三次握手和四次挥手
    • 三次握手
    • 四次挥手
    • 状态详解
  • TCP和UDP区别
      • UDPUser Data Protocol用户数据报协议
      • 区别

TCP/IP,是互联网各类协议族的总称,包括了很多协议,它为设备在互联网内传输信息规定了标准。

TCP/IP分层

四层模型

这里写图片描述

关于TCP/IP分层的说法有很多,在这里我们将它按照层次分为以下四层:
1. 应用层
应用层决定了向用户提供应用服务时通信的活动。
比如:FTP(文件传输协议)、DNS(域名系统)……
另外HTTP协议也属于该层(https增加了http安全性)
2. 传输层
由两个协议组成
- TCP(传输控制协议)
- UDP(用户数据报协议)
3. 网络层
网络层处理网络上流动的数据包。
数据包是网络传输的最小单位,而本层决定了数据包是怎样(路线)传送的对方。
4. 链路层
处理网络连接的硬件部分。

通信过程

在进行网络通信时,会按照层的顺序:发送端从应用层向下,接收端则往从下向上走。

TCP的三次握手和四次挥手

先介绍一下涉及到的概念:

  1. 位码即tcp标志位,有6种标示:
    • SYN(synchronous建立联机)
    • ACK(acknowledgement 确认)
    • PSH(push传送)
    • FIN(finish结束)
    • RST(reset重置)
    • URG(urgent紧急)
  2. Sequence number(顺序号码) 和 Acknowledge number(确认号码)
  3. 状态:CLOSED、LISTEN、SYN_RCVD等等;

三次握手

这里写图片描述

  1. 第一次握手:A发送位码为syn=1,随机产生sequence number=1234567的数据包到服务器,B由SYN=1知道,A要求建立联机;
  2. 第二次握手:B收到请求后要确认联机信息,向A发送acknowledge number=(客户端的sequence number+1),syn=1,ack=1,随机产生sequence number=3456789的包
  3. 第三次握手:A收到后检查acknowledge number是否正确,(即第一次发送的sequence number+1,以及位码acknowledge 是否为1)若正确,A会再发送acknowledge number=(B的seq+1),ack=1,B收到后确认sequence 值与ack=1则连接建立成功。
  4. 三次握手完成,A与B开始传送数据。

四次挥手

这里写图片描述

  1. 客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送(报文段4)
  2. 服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。
  3. 服务器B关闭与客户端A的连接,发送一个FIN给客户端A(报文段6)。
  4. 客户端A发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)

状态详解

  • CLOSED:表示初始状态。
  • LISTEN:表示服务器端的某个SOCKET处于监听状态,可以接受连接了。
  • SYN_RCVD: 这个状态表示接受到了SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,基本上用netstat你是很难看到这种状态的,除非你特意写了一个客户端测试程序,故意将三次TCP握手过程中最后一个ACK报文不予发送。因此这种状态时,当收到客户端的ACK报文后,它会进入到ESTABLISHED状态。
  • SYN_SENT: 这个状态与SYN_RCVD呼应,当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,因此也随即它会进入到了SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。
  • ESTABLISHED:表示连接已经建立了。
  • 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连接,但另外还告诉对方,我暂时还有点数据需要传送给你,稍后再关闭连接。
  • TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到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报文给对方,此时则进入到CLOSE_WAIT状态。接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以close这个SOCKET,发送FIN报文给对方,也即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。
  • LAST_ACK:这个状态是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。

TCP和UDP区别

UDP(User Data Protocol,用户数据报协议)

(1) UDP是一个非连接的协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。
(2) 由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。
(3) UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小。
(4) 吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制。
(5)UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态表(这里面有许多参数)。

区别

小结TCP与UDP的区别:
1.基于连接与无连接;
2.对系统资源的要求(TCP较多,TCP包头20字节;UDP少,UDP包头8个字节);
3.UDP程序结构较简单;
4.流模式与数据报模式 ;
5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。

0 0
原创粉丝点击