Java-----网络编程

Posted 小鹿可可乐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java-----网络编程相关的知识,希望对你有一定的参考价值。

网络编程

1.网络概念

1.1 计算机网络

通过传输介质、通信设施和网络通信协议,将分散在不同地点的计算机设备互联起来,实现资源共享和数据传输系统。

1.2 OSI参考模型

从上到下:

  • 应用层:为应用程序提供服务
  • 表示层:数据的格式化,数据加密
  • 会话层:建立连接,管理维护会话
  • 传输层:进行端到端的通信服务(端口号)
  • 网络层:主机节点到主机节点的可靠网络传输(IP)
  • 数据链路层:提供介质访问和链路管理
  • 物理层:提供硬件设备传输数据

1.3 TCP/IP协议族

  • 应用层:提供各种网络应用服务(OSI中对应应用层/表示层/会话层)
  • 运输层:建立应用程序间的端到端的连接,和可靠传输
  • 网际层:主机间的节点的数据传输
  • 网络接口层:更加底层的数据传输介质(OSI中对应数据链路层/物理层)

1.4 各层协议

应用层

1.HTTP:超文本传输协议:80
主要是web浏览器和服务端交互使用的协议
2.FTP:文件传输协议:21
减少或消除不同操作系统下,文件处理的不兼容性
3.SMTP:简单邮件传输协议:25
用来发送邮件
4.telnet、dns…

运输层

1.TCP:传输控制协议,提供了可靠的面向连接服务
2.UDP:用户数据报协议

网络层

1.IP:网络之间互联协议,路由选择等过程
2.ARP:地址解析协议,通过IP地址查询MAC地址
3.RARP:逆地址访问协议,将MAC地址转化为IP地址

重点

http:

  • http协议中有哪些方法:get\\post\\delete
  • get和post方法的区别?
  • http协议有哪些信息?
  • 常见状态码意义?
  • HTTP和HTTPS协议的异同点?
  • 在浏览器上输入一个URL,后台经历了什么操作?

2.运输层

2.1 TCP

1.概念:

是传输控制协议,面向连接的可靠的传输协议
面向连接:即通过TCP进行数据传输前需要建立连接,传输结束后关闭连接
可靠体现:滑动窗口,超时应答

2.特点:

  • 面向连接;通信之前必须建立连接
  • 每一条TCP连接只能是点对点的(一对一);
  • 提供可靠交付的服务;通过TCP传输的数据,无差错,不丢失,不重复。
  • 提供全双工通信;
  • 面向字节流。虽然程序和TCP交互是一次一个数据块,但是把应用程序交下来的数据看成仅仅是一连串的无结构的字节流。
  • TCP首部占20字节。

3.TCP首部信息


16位的源端口号和目的端口号端口号就是标识特定主机上的唯一的进程,而IP地址是来表示标识网络中的不同主机的,这两个源(source)和目的(dst)端口号和IP首部中的源和目的IP地址,则标识互联网上的唯一进程,所以套接字的定义说白了就是IP地址和端口号共同组成。

32位的序号表示在这个报文段中的第一个数据字节序号。如果将字节流看作在两个应用程序间的单向流动,则TCP用序列号对每个字节进行计数。用来保证到达数据顺序的编号,所以这个字段需要比较大的存储。

32位的确认序号确认序号是下一个期望接收的TCP分段号,相当于是对对方所发送的并且已经被本方所正确接受的分段的确认。仅当ACK标志为1时有效。确认号表示期望收到的下一个字节的序号。

  • (1) ack表示期望下次接收到的序号

  • (2) 那么ack是如何算出来的呢,就是通过收到的序号,和数据长度相加得来。假设A收到B过来的数据(seq = 5,len = 15)。len表示数据长度。那么A就会回复B,“刚才的数据我已经收到了,你接下来就发序号为20的包给我吧”。这样就保证了数据不会乱序。

4位的报头长度以32位(4字节)字长为单位,需要这个值是因为任选字段的长度是可变的。以4字节为单位是一个字长。2^4=15即最大是60个字节。不存在任选字段正常的报头长度是20字节。其实相当于给出数据在数据段中的开始位置。保留位6位,必须为0
标志位占有6个比特位,他们中可以有多个为置为1,依次为:URG,ACK,PSH,RST,SYN,FIN。
下面具体分析:

  • URG:该位为1说明表示TCP包的紧急指针域有效,用来保证TCP连接不被中断,并督促上层应用敢快处理这些数据。

  • ACK:确认号有效

  • PSH:接收方应尽快将这个报文交给应用层,叫做push。所谓Push操作就是指在数据包到达接收端以后,立即传送给应用程序,而不是在缓冲区中排队。

  • RST:连接复位,复位因主机奔溃或其他原因而出现的错误连接,也可以用于拒绝非法的分段或拒绝连接请求,这个用处还是比较多的

  • SYN:是一个同步序号,通常与ACK合用用来建立连接。也就是常说的三次握手

  • FIN:既然有建立连接那么必然有拆除连接,这个字段表示发送端已经达到数据末尾,也就是说双方的数据传送完成,没有数据可以传送了,发送FIN标志位的TCP数据包后,连接将被断开。这个标志的数据包也经常被用于进行端口扫描。

看到上面,有些人就会有些疑问,URG和PSH都是紧急时使用,那么这两个有什么关系和区别呢?

  • 答:在一般的数据中都会存在PSH,而URG只有在紧急情况下才会触发TCP报文中的紧急指针字段,

那么到底什么样的情况才是紧急情况呢?

  • 紧急方式是向对方发送紧急数据的一种方式,表示数据需要优先处理。它是一个正的偏移,与TCP首部中序号字段的值相加表示紧急数据后面的字节,紧急指针是数据最后一个字节,TCP首部中只有紧急指针指出紧急数据的位置,它所指的字节为紧急数据,但没有办法指定紧急数据的长度。紧急指针只有当URG标志置1时紧急指针才有效。紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。窗口大小TCP的流量控制由连接的每一端通过声明的窗口大小来提供。窗口大小为字节数,起始于确认序号字段指明的值,这个值是接收端正期望接收的字节。这是一个16
    bit字段,因而窗口大小最大为65535。校验和用于对分段首部和数据进行校验。正常情况下为一定为0

    4.三次握手


    第一次握手客户机发送连接请求报文段到服务器,并进入SYN_SENT状态,等待服务器确认。
    (SYN = 1,seq=x)
    第二次握手服务器收到连接请求报文,如果同意建立连接,向客户机发回确认报文段,并为该TCP连接分配TCP缓存和变量。(SYN=1,ACK=1,seq=y,ack=x+1)。
    第三次握手客户机收到服务器的确认报文段后,向服务器给出确认报文段,并且也要给该连接分配缓存和变量。此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。(ACK=1,seq=x+1,ack=y+1)。

5.四次挥手


关注点:客户端服务端的状态变化及挥手携带的首部信息

6.滑动窗口

用来进行流量控制,避免网络拥塞

7.拥塞控制

拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载

8.重点

TCP协议是如何保证数据可靠性?
1、校验和
2、确认ACK3、序列号
4、超时重传/快启动

2.2 UDP

1.概念

UDP:用户数据报协议,它是TCP/IP协议簇中无连接的运输层协议。

2.特点

UDP特点:
1、无连接;
2、 尽最大努力交付;
3、面向报文;
4、无拥塞控制;
5、支持一对一、一对多、多对一和多对多的交互通信;
6、首部开销小(只有四个字段:源端口、目的端口、长度、检验和)。UDP首部占8 个字节

3.UDP首部


1) 源端口 :在需要对方回信时选用。不需要时可用全0。
2) 目的端口 : 在终点交付报文时必须使用到。
3) 长度 :UDP用户数据报的长度,其最小值为8(仅包含首部)。
4)检验和 :检验UDP用户数据报在传输中是否有错,有错就丢弃。

3.网络层

3.1 IP协议

1. IP首部


版本号:占4位,指IP协议的版本,有IPv4和IPv6两种,对于IPv4协议该字段就是4
首部长度:占4位,指IP协议的报头长度,范围在20-60字节
区分服务:占8位,只有在使用区分服务时该字段才有作用,一般情况下不使用该字段
长度:占16位,指IP协议的总长度:报头长度+数据长度
根据IP报头来看,长度占16位,长度应该在65535个字节,但实际传送不了这么大长度的IP报文;
IP报文的长度是依据下层数据链路层规定的数据帧中的数据字段的最大长度,称为最大传输单元MTU;
一般最大传输单元MTU的长度为1500个字节,所以IP报文最大长度为1500个字节,若超过该长度,IP报文会被分片。
16位标识、3位标志、13位片偏移用于IP报文的分片和组装标识:占16位,由于IP报文有长度的限制,超过MTU会被分片,而在交付给上层时需要将IP报文组装,该字段用于唯一标识一个IP报文标志:占3位,第一位为保留位,第二位表示该IP报文是否分片(1表示禁止分片,0表示分片),第三位表示该IP报文是否为最后一个片偏移:占13位,在报文分片时有效,表示该片报文应位于整个IP报文的那个位置
生存时间TTL:占8位,在路由时通过一跳与多跳的方式查找路径,为防止某个报文在网络中一直处于游离状态,无限循环,所以在报头中规定了报文在网络中最多经过路由器的数量,也就是该报文的最大跳数
协议类型:占8位,表示该IP报文要交给上层的那个协议(UDP或TCP)
首部校验和:占16位,鉴别头部是否有损坏
源IP:占32位,表示该IP报文从哪里来
目的IP:占32位,表示该IP报文要发送到哪里

2.表示形式

点分十进制:数据分成4组,每组范围[0,255]
二进制(每8位为一组) 例如:00000000 00000000 00000000 00000000

3.划分

IP地址主要划分为网络标识和主机标识
网络标识:高位为网络标识位,保证互联的网络中每个段是不重复的
主机标识:低位为主机标识,在同一个网段中是不允许重复的

4.IP地址分级

  • 1.A 类 IP 地址是首位以 “0” 开头的地址。 从第 1 位到第 8 位是它的网络标识。用十进制表示的话,0.0.0.0~127.0.0.0 是 A 类的网络地址。A 类地址的后 24位相当于主机标识。因此,一个网段内可容纳的主机地址上限为16,777,214个。
  • B 类 IP 地址是前两位 “10” 的地址。 从第 1 位到第 16
    位是它的网络标识。用十进制表示的话,128.0.0.0~191.255.0.0 是 B 类的网络地址。B 类地址的后 16
    位相当于主机标识。因此,一个网段内可容纳的主机地址上限为65,534个。
  • C 类 IP 地址是前三位为 “110” 的地址。从第 1 位到第 24
    位是它的网络标识。用十进制表示的话,192.0.0.0~223.255.255.0 是 C 类的网络地址。C 类地址的后 8
    位相当于主机标识。因此,一个网段内可容纳的主机地址上限为254个
  • D 类 IP 地址是前四位为 “1110” 的地址。从第 1 位到第 32
    位是它的网络标识。用十进制表示的话,224.0.0.0~239.255.255.255 是 D 类的网络地址。D
    类地址没有主机标识,常用于多播。

5.子网掩码

通过子网掩码来划分网络标识和主机标识,网络标识全为1,主机标识全为0,子网掩码的IP地址首位开始必须是连续性的1

  • 表示形式1:将IP地址和子网掩码地址分别分行表示以 172.20.100.52 的前 26 位是网络地址的情况为例,如下:IP 地址
    172. 20. 100. 52 子网掩码 255. 255. 255. 192 网络地址 172. 20. 100. 0
  • 表示形式2:在每个IP地址的后面追加网络地址的位数用“/”隔开IP 地址 172. 20. 100. 52 / 26 网络地址 172. 20. 100. 0 / 26 在第二种方式下记述网络地址时可以省略后面的 “0” 。例如:172.20.0.0/26 跟 172.20/26 其实是一个意思。

以上是关于Java-----网络编程的主要内容,如果未能解决你的问题,请参考以下文章

什么是通过编程设置的上限收集限制

Java之网络HTTP协议的基本格式总结

急!!IP数据报必须考虑最大传送单元MTU,这是指哪一层的最大传送单元?包括不包括首部或尾部等开销在内?

1-3:网络初识之网络传输的基本流程TCP首部,IP首部,MAC地址,IP地址等

第7章 网络层协议_网络层首部

计算机网络—— 运输层:TCP报文段的首部格式