【java】网络编程之传输协议(五)

文章目录

    • 网络协议
    • TCP/UDP协议
      • TCP传输协议
        • 三次握手
        • 四次挥手
      • UDP传输协议
    • 套接字Socket
    • 总结

继续记笔记。。。

传送门:java 8 中文版在线api学习手册:http://www.matools.com/api/java8

网络协议

网络协议是在计算机网络中进行数据交换时所必须遵守的规则的集合。也就是说,网络协议包含了很多通信的规则。

首先,我们都知道很多设备/计算机相连组成的计算机网络,那么在这样一个大网络中,任意两台设备需要进行通信,是要遵循一定的规则才能进行信息交换,不然整个网络的信息交换就会出现很混乱并且不可靠。比如你要打电话给甲,但是在由手机构成的大网络里面,你可能连接不上甲,又或者甲拒绝与你通信你却不知道,又或者你们之间的聊天所有的人都可以听到,为了避免混乱,我们需要制定相应规则并遵守,才能维持良好的通信。

网络协议的制定就是为了能使网络上各种设备能够正确地相互交换信息。 它包含了很多类型,常见的协议有:TCP/IP协议、IPX/SPX协议、NetBEUI协议等。

TCP/UDP协议

【java】网络编程之传输协议(五)_第1张图片

图来源:https://www.runoob.com/tcpip/tcpip-tutorial.html

我们都知道OSI的七层模型,而TCP/IP网络模型就将网络分成了五层,它与OSI模型有些类似,只是将表示层、会话层去掉,合并了数据链路层和物理层作为网络接口层。

【java】网络编程之传输协议(五)_第2张图片

图来源:https://www.cnblogs.com/qishui/p/5428938.html

对应TCP/IP网络模型的协议就是TCP/IP协议。它是互联网的基础协议,任何和互联网有关的操作都离不开TCP/IP协议。在TCP/IP协议网络体系中,有包含一系列处理数据通信的协议:

  • TCP协议(传输控制协议):应用程序之间可靠稳定的通信
  • UDP协议(用户数据报协议):应用程序之间简单的通信
  • IP协议 (网际协议):计算机之间的通信
  • ICMP协议(因特网消息控制协议):主机和路由器之间传递控制消息的通信(专门针对通信错误和通信状态的协议)
  • DHCP协议(动态主机配置协议):局域网分配IP地址的协议(针对动态寻址)

其中,TCP和UDP是传输层最重要的两个协议,它们为上层用户提供级别的通信可靠性。

TCP传输协议

TCP(Transfer Control Protocol)传输控制协议: 它定义了两台计算机之间进行可靠的通信连接协议。提供的是面向连接(连接导向)的,基于字节流的运输层(Transport Layer)的通信协议。它的特点:

  • 面向连接
  • 点到点的通信
  • 高可靠性
  • 占用系统资源多、效率低

TCP协议可靠,一对一,在传递数据之前需要三次握手来建立连接,而且在数据传递过程中,有确认、窗口、重传、拥塞控制机制,传完之后还需要四次挥手断开连接。

下面简单介绍一下著名的三次握手和四次挥手。

三次握手

假设A与B要建立TCP连接,简单地过程是这样的:

  1. 第一次握手:A–发送请求–>B

  2. 第二次握手:A<–确认A的请求并发送请求–B

  3. 第三次握手:A–确认B的请求–>B

【java】网络编程之传输协议(五)_第3张图片

哈哈哈哈,图已经很形象了。如果还不能理解三次握手的话(认真学习的娃要看理论),那我们就从概念上理解,复杂地表述就是:在建立TCP连接之前,通信双方也就是A和B必须要先了解对方四个信息:

  1. 对方报文发送的开始序号
  2. 对方发送数据的缓冲区大小
  3. 能被接收的最大报文段长度MSS
  4. 被支持的TCP选项

为什么要知道这四个信息呢?这跟传输时的TCP报文有关系。
【java】网络编程之传输协议(五)_第4张图片
TCP报文是TCP层传输的数据单元,也叫报文段。这里有几个重要的内容需要在传输时填写的。

  1. 序号 :序号是报文段发送的第一个字节的序号,它确保了TCP传输的有序性
  2. 确认号 :即ACK,指明下一个期待收到的字节序号,并表明该序号之前的数据已经正确无误的收到
  3. 控制位 :有6个,每一个标志位表示一个控制功能
    1)URG:紧急指针标志,值为1时表示紧急指针有效,为0时则忽略紧急指针
    2)ACK:确认序号标志,值为1时表示确认号有效,为0时则报文中不含确认信息
    3)PSH:push标志,值为1时表示接收方在接收到该报文段后,需要尽快将报文段交给应用程序,而不要放在缓冲区排队等候,为0时则忽略
    4)RST:重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接,或者用于拒绝非法的报文段和拒绝连接请求
    5)SYN:同步序号,用于建立连接过程 在连接请求中,SYN=1及ACK=0表示还没收到确认信息,SYN=1且ACK=1,表示确认连接。
    6)FIN:finish标志,值为1时表示发送方已经不发送数据,可关闭本次数据流,为0时则忽略

图来源:https://blog.csdn.net/paincupid/article/details/79726795

开始建立连接:

  • 第一次握手: 建立连接时,A发送标志位syn=1和随机产生一个序列号seqA=k到B,进入SYN_SENT状态,等待B确认;
  • 第二次握手: B收到syn=1的请求,确认连接信息,并向A发送ACK=1,SYN=1,然后随机产生序列号seqB=seqA+1,此时B进入SYN_RECV状态;
  • 第三次握手: A收到B的SYN+ACK,向B发送确认ACK,此标志位发送完毕,A和B进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

四次挥手

断开一个连接需要四次挥手,四次挥手的过程是:
【java】网络编程之传输协议(五)_第5张图片
官方说法:

  • 第一次挥手: 当数据传输即将完成,A向B发送FIN=1的请求关闭标志位,代表告诉B,这边数据传输即将完成,准备关闭连接
  • 第二次挥手: 当B收到A收到的FIN=1的标志位后,会先发送一个ACK=1的应答信息;表达的意思是你的请求关闭我已收到啦,但我还有数据传输未搞定,待我搞定完再告诉你。
  • 第三次挥手: B数据传输完成,向A发送FIN=1
  • 第四次挥手: A收到B发送的FIN=1后,还要考虑到网络不稳定等原因,怕B不知道他要断开连接,于是向B发送ACK=1确认信息进行确认同时把自身状态设置为time_wait状态,启动计时器。如果B没有收到A发送的ACK,则在计时器结束后会要求A再发送一次ACK,当B收到A的ack后,B断开连接。

UDP传输协议

UDP(User Datagram Protocol)用户数据报协议: 这是一个简单的面向数据报的传输层协议,提供的是无连接、面向事务的简单却不可靠的信息传送服务。它的特点:

  • 非面向连接,传输不可靠,可能会丢失
  • 发送不管对方是否准备好,接收方收到也不会确认
  • 可以广播发送
  • 非常简单的协议,开销小

UDP是一种无需连接的协议,它与TCP协议一样可用于处理数据包,但是它相对不可靠,也就是报文发送出去之后,发送方是不知道报文有没有成功到达的。UDP支持一对一、多对一、多对多等方式,也就是单播,多播和广播。

UDP的适用场景是:用于实时应用,比如视频会议、直播等等。

套接字Socket

TCP和UDP都是属于传输层的协议,而我们开发的网络应用程序是位于应用层的,那么在应用层,该如何使用传输层的服务?套接字就是解决这个问题的,有了它就能实现应用层和传输层分离。在java设计模式中,Socket就是接口。

应用层能通过Socket发送或者接收数据,并能对数据报文作读写、打开关闭等操作。同时Socket的存在,还允许应用程序直接将I/O插入到网络中,实现与网络中其他应用程序进行通信。

往后会结合Java类来介绍这些概念以及测试例子,这里就先不展开关于socket编程的东西了。

总结

介绍了网络编程中很重要的一部分:传输。传输要遵守一定的规则,这些规则就是我们的传输协议了。其中最有名的就是TCP/IP协议,当中还介绍了TCP的三次握手及四次挥手,还有UDP协议以及套接字的概念。今天的笔记就到这里啦,后续再慢慢整理。。。

参考文章:
https://blog.csdn.net/paincupid/article/details/79726795
https://www.cnblogs.com/hnrainll/archive/2011/10/14/2212415.html
https://zhuanlan.zhihu.com/p/42224106
https://www.cnblogs.com/fundebug/p/differences-of-tcp-and-udp.html

你可能感兴趣的:(java)