java tcpip_Java基础——TCP/IP协议详解

什么是协议?

简单来说,协议就是计算机之间通过网络实现通信时事先达成的一种“约定”;这种“约定”使那些由不同厂商的设备,不同CPU及不同操作系统组成的计算机之间,只要遵循相同的协议就可以实现通信。TCP/IP通常被认为是一个四层协议,如图:

8e4eb47421f5

TCP IP四层协议图.png

链路层:数据链路层或网络接口层,包括设备驱动程序和网络接口卡,它们一起处理与电缆的物理接口细节。

网络层:处理分组在网络中的活动,如分组的选路;网络层的协议包括IP协议、ICMP协议(Internet互联网控制报文协议)、IGMP协议(Internet组管理协议)。

传输层:主要为两台主机上的应用程序提供端到端的通信,包括TCP(传输控制协议)和UDP(用户数据报协议)。

应用层:处理特定的应用程序细节。

8e4eb47421f5

TCP IP协议详细.png

链路层的三个主要作用:

1)为IP模块发送和接受IP数据;

2)为ARP模块发送ARP请求和接受ARP应答;

3)为RARP发送RARP请求和接受RARP应答。

TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的,所以开发者并不需要理解得十分透彻,只需要对TCP底层运作机制有一个大致理解即可,这一块有些复杂,先做个笔记,以后有需要,再做详细扩展

拓展:检测网络是否联通的命令——Ping

Ping的目的是为了测试另一台主机是否可达,该命令会发送一份ICMP回显请求报文给主机,并等待返回ICMP回显应答。

Ping程序还能测出到这台主机的往返时间,大多数的TCP/IP实现都在内核中直接支持Ping服务,这种服务器不是一个用户进程。Ping程序通过在ICMP报文数据中存放请求的时间值来计算往返时间。当应答返回时,用当前时间减去存放在ICMP报文中的时间值,既是往返时间。

什么是传输包?

将需要传输的数据分割为一个个小的单位进行传输的方法,就叫做包,如图:

8e4eb47421f5

包传输.png

通信过程中,每一个分组中都会附加上源主机地址和目标主机地址送给通信线路,这些发送端地址、接收端地址以及分组序号写入的部分就是“报文首部”;如果数据较大,分组过多,那么就有必要将分组序号写入包中,接收端会根据序号,分组按序重新装配为原始数据。(理解丢包就需要知道什么是包)

什么是“三次握手,四次挥手”?

TCP是一种面向连接的单播协议,在发送数据前,通信双方必须在彼此间建立一条连接。该“连接”就是客户端和服务器的内存里保存的关于ip地址、端口号等对方的信息。TCP可以看成是一种字节流,它会处理IP层或以下的层的丢包、重复以及错误问题。在连接的建立过程中,双方需要交换一些连接的参数。这些参数可以放在TCP头部。

TCP提供了一种可靠、面向连接、字节流、传输层的服务,采用三次握手建立一个连接,采用4次挥手来关闭一个连接。

为什么要“三次握手,四次挥手”?

1)所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息。在socket编程中,客户端执行connect()时,将触发三次握手:即客户端和服务端通信前要进行连接,“3次握手”的作用就是双方都能明确自己和对方的收、发能力正常。

8e4eb47421f5

TCP三次握手.png

第一次握手:客户端发送网络包,服务端收到。服务端得出结论:客户端发送能力、服务端接收能力正常。

第二次握手:服务端发包,客户端收到。客户端得出结论:服务端接收、发送能力正常,客户端接收、发送能力正常。

第三次握手:客户端发包,服务端收到。服务端得出结论:客户端接收、发送能力正常,服务端发送、接收能力正常。

所以第一、二次握手,只是为了验证彼此的接收发送能力是否正常。经历上面的三次握手过程,客户端和服务端都确认了自己的接收、发送能力是正常的,就可以正常通信了。

2)所谓四次挥手(four-way handshake),就是指TCP的连接的拆除过程需要发送四个包,客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。

8e4eb47421f5

TCP四次挥手.jpg

TCP连接是双向传输的对等的模式,就是说双方都可以同时向对方发送或接收数据。客户端或者服务端皆可以主动发送指令告诉对方,我要关闭连接了,比如:

客户端:我要关闭连接了(客户端发起Close)

服务端:好,你关吧(服务端收到关闭指令,回了一个ACK)【此时客户端不可以向服务端传输数据,但是服务端仍然可以向客户端传输数据】

服务端:我传完所有数据啦(发送一个FIN段来关闭向客户端传输方向上的连接)

客户端:哦,好的,知道(发送ACK确认关闭连接)

注意:接收到FIN报文的一方只能回复一个ACK, 它是无法马上返回对方一个FIN报文段的,因为结束数据传输的“指令”是上层应用层给出的,它只负责“搬运”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值