java网络编程

三次握手和四次挥手
专业名词
序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。
确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。
确认ACK位:占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效。
同步SYN:连接建立时用于同步序号。当SYN=1,ACK=0时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接受报文。SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0。
三次握手
在这里插入图片描述
过程:
1、客户端发出请求,同步位SYN-1,并为自己初始化一个序列号,为seq=x;
2、服务端收到请求,若同意连接,同意命令为SYN=1,确认位ACK=1,确认号为ack=x+1,并为自己初始化一个序列号seq=y;
3、客户端回复服务端同意,确认位为ACK=1,确认号为ack=y+1,序列号为seq=y+1;
为什么要有最后的确认回复
主要防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。
如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送了第一个请求连接并且没有丢失,只是因为在网络结点中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。
如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。
四次挥手
在这里插入图片描述
过程:
1、客户端发出释放连接请求,并不再发送数据,但还可接受数据,此时终止位FIN=1,序列号seq=u,为最后传入的字节数+1;
2、服务器收到请求,并确认,此时确认位为ACK=1,确认号为ack=u+1,序列号为v;
3、服务器发出释放连接请求,在这之前可能服务器还发送了数据给客户端,此时FIN=1,确认位ACK=1,确认号为ack=u+1,序列号为seq=w,因为有可能发送了数据;
4、客服端收到请求,发出确认报文,服务器收到报文连接释放,此时确认位ACK=1,ack=w+1,seq=u+1;
为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
五层因特网协议栈

应用层
运输层
网络层
数据链路层
物理层
应用层: 任务是通过应用进程间的交互来完成特定网络应用,应用层协议是应用进程间通信和交互的规则。有DNS域名系统:它作为将域名和IP地址相互映射的一个分布式数据库;HTTP协议;SMTP协议支持电子邮件,FTP协议:文件传输协议用于互联网双向传输,控制文件下载空间在服务器复制文件,从本地计算机或本地上传文件复制到服务器上的空间等
运输层: 为两台主机中进程之间的通信提供通用的数据传输服务,主要有TCP和UDP两种协议。
TCP: 传输控制协议,提供面向连接的、可靠的数据传输服务,其数据传输的单位是报文段
UDP: 用户数据协议,提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性),数据传输单位是用户数据报。
区别:
TCP 是面向连接的,UDP 是面向无连接的
UDP程序结构较简单
TCP 是面向字节流的,UDP 是基于数据报的
TCP 保证数据正确性,UDP 可能丢包
TCP 保证数据顺序,UDP 不保证
网络层: 为分组交换网上的不同主机提供通信服务以及选择合适的路由使源主机运输层所传下来的分组,能通过网络中的路由器找到目的主机,使用ip协议
数据链路层: 负责将IP数据报封装成合适在物理网络上传输的帧格式并传输,或将从物理网络接收到的帧解封,取出IP数据报交给网络层,每一帧包括数据和必要的控制信息。
物理层: 负责将比特流在结点间传输,即负责物理传输,数据单位是比特,链路层的任务是将整个帧从一个网络元素移动到邻近的网络元素,而物理层的任务是将该帧中的一个一个比特从一个节点移动到下一个节点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值