java udp 并发_Java常见面试题汇总--计算机网络(TCP三次握手与四次挥手、TCP流量控制、TCP与UDP对比)...

1、源端口号:表示发送端端口号,字段长为16位。 2、目标端口号:表示接收端口号,字段长为16位。 3、序列号:表示发送数据的位置,字段长为32位。每发送一次数据,就累加一次该数据字节数的大小。 注意:序列号不会从0或1开始,而是在建立连接时由计算机生成的一个随机数作为其初始值,通过SYN包发送给接收端主机。然后再将每次转发过去的字节数累加到初始值上表示数据的位置。 4、确认应答号:表示下一次应该收到的数据的序列号,字段长为32字节。发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。 序号的优点: (1)保证报文按序到达。 (2)保证可靠性。 (3)保证效率。 (4)精准的报告哪些报文已经收到,哪些需要重传。 5、首部长度:该字段长度为4位,单位为4字节(32位)。TCP首部长度不包括选项的话,是20个字节,20/4=5,5的二进制序列:0101,报头长度也叫数据偏移,所以该字段可以设置为5,选项字段最大的是40字节,所以,TCP首部长度为最大为20+40=60字节,该字段可以设置的最大长度为60/4=15。 6、保留:该字段主要是为了以后扩展时使用,其长度为4位。一般设置为0,即使收到的包在该字段不为0,此包也不会丢弃。 7、控制位:字段长为6,每一位从左到右分别为:URG、ACK、PSH、RST、SYN、FIN。当对应的值为1,表示有具体含义。

字段含义URG紧急指针是否有效。为1,表示某一位需要被优先处理。ACK确认号是否有效,一般置为1。PSH提示接收端应用程序立即从TCP缓冲区把数据读走。RST对方要求重新建立连接,复位。SYN请求建立连接,并在其序列号的字段进行序列号的初始值设定。建立连接,设置为1。FIN希望断开连接。

8、窗口大小:接收缓冲区的大小,TCP不允许发送超过此处所示大小的数据。 9、校验和:发送端填充,CRC校验,接收校验不通过,则认为数据有问题。和UDP的区别是,UDP校验的是数据本身,TCP校验的不仅包含TCP首部,而且包含TCP数据部分。 10、紧急指针:只有在URG为1时有效,该字段为1表示本报文的段中的紧急数据的指针。 11、选项:用于提高TCP的传输性能。需要根据首部长度进行控制,其最大长度为40字节。

1、序列号seq 占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生,给字节编上序号后,就给每一个报文段指派一个序号,序列号seq就是这个报文段中的第一个字节的数据编号。 2、确认号ack 占4个字节,期待收到对方下一个报文段的第一个数据字节的序号,序列号表示报文段携带数据的第一个字节的编号,而确认号指的是期望接受到下一个字节的编号,因此当前报文段最后一个字节的编号+1即是确认号。 3、确认ACK 占1个比特位,仅当ACK=1,确认号字段才有效。ACK=0,确认号无效。 4、同步SYN 连接建立时用于同步序号。当SYN=1,ACK=0表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使用SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接收报文,SYN这个标志位只有在TCP建立连接才会被置为1,握手完成后SYN标志位被置为0。 5、终止FIN 用来释放一个连接。

step1:第一次握手 建立连接时,客户端发送SYN包到服务器,其中包含客户端的初始序号seq=x,并进入SYN_SENT状态,等待服务器确认。(其中,SYN=1,ACK=0,表示这是一个TCP连接请求数据报文;序号seq=x,表明传输数据时的第一个数据字节的序号是x)。 step2:第二次握手 服务器收到请求后,必须确认客户的数据包。同时自己也发送一个SYN包,即SYN+ACK包,此时服务器进入SYN_RECV状态。(其中确认报文段中,标识位SYN=1,ACK=1,表示这是一个TCP连接响应数据报文,并含服务端的初始序号seq(服务器)=y,以及服务器对客户端初始序号的确认号ack(服务器)=seq(客户端)+1=x+1)。 step3:第三次握手 客户端收到服务器的SYN+ACK包,向服务器发送一个序列号(seq=x+1),确认号为ack(客户端)=y+1,此包发送完毕,客户端和服务器进入ESTAB_LISHED(TCP连接成功)状态,完成三次握手。 未连接队列 在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包时,删除该条目,服务器进入ESTAB_LISHED状态。

step1:第一次挥手 首先,客户端发送一个FIN,用来关闭客户端到服务器的数据传送,然后等待服务器的确认。其中终止标志位FIN=1,序列号seq=u。 step2:第二次挥手 服务器收到这个FIN,它发送一个ACK,确认ack为收到的序号加一。 step3:第三次挥手 关闭服务器到客户端的连接,发送一个FIN给客户端。 step4:第四次挥手 客户端收到FIN后,并发回一个ACK报文确认,并将确认序号seq设置为收到序号加一。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。 客户端发送FIN后,进入终止等待状态,服务器收到客户端连接释放报文段后,就立即给客户端发送确认,服务器就进入CLOSE_WAIT状态,此时TCP服务器进程就通知高层应用进程,因而从客户端到服务器的连接就释放了。此时是“半关闭状态”,即客户端不可以发送给服务器,服务器可以发送给客户端。 此时,如果服务器没有数据报发送给客户端,其应用程序就通知TCP释放连接,然后发送给客户端连接释放数据报,并等待确认。客户端发送确认后,进入TIME_WAIT状态,但是此时TCP连接还没有释放,然后经过等待计时器设置的2MSL(2倍报文最大生存时间)后,才进入到CLOSE状态。 【注意】中断连接端可以是 Client 端,也可以是 Server 端。 假设 Client 端发起中断连接请求,也就是发送 FIN 报文。Server 端接到 FIN 报文后,意思是说"我 Client 端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭 Socket,可以继续发送数据。所以你先发送 ACK,"告诉 Client 端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候 Client 端就进入FIN_WAIT 状态,继续等待 Server 端的 FIN 报文。当 Server 端确定数据已发送完成,则向 Client 端发送 FIN 报文,"告诉 Client 端,好了,我这边数据发完了,准备好关闭连接了"。Client 端收到 FIN 报文后,“就知道可以关闭连接了,但是他还是不相信网络,怕 Server 端不知道要关闭,所以发送 ACK 后进入 TIME_WAIT 状态,如果 Server端没有收到 ACK 则可以重传。”Server 端收到 ACK 后,"就知道可以断开连接了"。Client端等待了 2MSL 后依然没有收到回复,则证明 Server 端已正常关闭,那好,我 Client 端也可以关闭连接了。Ok,TCP连接就这样关闭了!

我们来分析一种特殊情况,假设客户端请求建立连接,发给服务器SYN包等待服务器确认,服务器收到确认后,如果是两次握手,假设服务器给客户端在第二次握手时发送数据,数据从服务器发出,服务器认为连接已经建立,但在发送数据的过程中数据丢失,客户端认为连接没有建立,会进行重传。假设每次发送的数据一直在丢失,客户端一直SYN,服务器就会产生多个无效连接,占用资源,这个时候服务器可能会挂掉。这个现象就是我们听过的“SYN的洪水攻击”。 总结:第三次握手是为了防止:如果客户端迟迟没有收到服务器返回确认报文,这时会放弃连接,重新启动一条连接请求,但问题是:服务器不知道客户端没有收到,所以他会收到两个连接,浪费连接开销。如果每次都是这样,就会浪费多个连接开销。 也是为了防止失效的连接请求报文段突然又传送到服务器,因而产生错误。

确保数据能够完成传输。 关闭连接时,当收到对方的 FIN 报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭 SOCKET,也即你可能还需要发送一些数据给对方之后,再发送 FIN 报文给对方来表示你同意现在可以关闭连接了,所以它这里的 ACK 报文和FIN 报文多数情况下都是分开发送的。 TCP 协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP 是全双工模式,这就意味着,当主机 1 发出 FIN 报文段时,只是表示主机 1 已经没有数据要发送了,主机 1 告诉主机 2,它的数据已经全部发送完毕了;但是,这个时候主机 1 还是可以接受来自主机 2 的数据;当主机 2 返回 ACK 报文段时,表示它已经知道主机 1 没有数据发送了,但是主机 2 还是可以发送数据到主机 1 的;当主机 2 也发送了 FIN 报文段时,这个时候就表示主机 2 也没有数据要发送了,就会告诉主机 1,我也没有数据要发送了,之后彼此就会愉快的中断这次 TCP 连接。

1)、可靠地实现 TCP 全双工连接的终止 我们必须要假想网络是不可靠的,你无法保证你最后发送的 ACK 报文会一定被对方收到,因此对方处于 LAST_ACK 状态下的 SOCKET 可能会因为超时未收到 ACK 报文,而重发 FIN报文,client 必须维护这条连接的状态(保持 time_wait,具体而言,就是这条TCP 连接对应的(local_ip, local_port)资源不能被立即释放或重新分配)以便可以重发丢失的 ACK,如果主动关闭端不维持 TIME_WAIT 状态,而是处于 CLOSED 状态,主动关闭端将会响应一个 RST,结果 server 认为发生错误,导致服务器端不能正常关闭连接。所以这个TIME_WAIT 状态的作用就是用来重发可能丢失的 ACK 报文。所以,当客户端等待 2MSL(2倍报文最大生存时间)后,没有收到服务端的 FIN 报文后,他就知道服务端已收到了 ACK报文,所以客户端此时才关闭自己的连接。 2)、允许老的重复分节在网络中消逝 2MSL可以使本连接持续的时间内所有所产生的报文段都从网络中消失。这样就可以使下一个新的连接中不会出现旧的连接的请求报文段。 如果 TIME_WAIT 状态保持时间不足够长 (比如小于2MSL),第一个连接就正常终止了。第二个拥有相同四元组(local_ip, local_port, remote_ip,remote_port)的连接出现(建立起一个相同的 IP 地址和端口之间的 TCP 连接),而第一个连接的重复报文到达,干扰了第二个连接。TCP 实现必须防止某个连接的重复报文在连接终止后出现,所以让TIME_WAIT 状态保持时间足够长 (2MSL),连接相应方向上的 TCP 报文要么完全响应完毕,要么被丢弃。建立第二个连接的时候,不会混淆。

如果系统中有很多 socket 处于 TIME_WAIT 状态,当需要创建新的 socket 连接的时候可能会受到影响,这也会影响到系统的扩展性。 之所以 TIME_WAIT 能够影响系统的扩展性是因为在一个 TCP 连接中,一个 Socket如果关闭的话,它将保持 TIME_WAIT 状态大约 1-4分钟。如果很多连接快速的打开和关闭的话,系统中处于 TIME_WAIT 状态的 socket 将会积累很多,由于本地端口数量的限制,同一时间只有有限数量的 socket 连接可以建立,如果太多的socket 处于TIME_WAIT状态,你会发现,由于用于新建连接的本地端口太缺乏,将会很难再建立新的对外连接。

0、在传递数据之前,会有三次握手来建立连接。 1、应用数据被分割成 TCP 认为最适合发送的数据块(按字节编号,合理分片)。这和UDP完全不同,应用程序产生的数据报长度将保持不变。(将数据截断为合理的长度) 2、当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。(超时重发) 3、当 TCP 收到发自 TCP 连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒 。(对于收到的请求,给出确认响应) (之所以推迟,可能是要对包做完整校验)。 4、TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。(校验出包有错,丢弃报文段,不给出响应,TCP 发送数据端,超时时会重发数据) 5、既然 TCP 报文段作为 IP 数据报来传输,而 IP 数据报的到达可能会失序,因此TCP 报文段的到达也可能会失序。如果必要,TCP 将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。(对失序数据进行重新排序,然后才交给应用层) 6、既然 IP 数据报会发生重复,TCP 的接收端必须丢弃重复的数据。(对于重复数据,能够丢弃重复数据) 7、TCP 还能提供流量控制。TCP 连接的每一方都有固定大小的缓冲空间。TCP 的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。(TCP 可以进行流量控制,防止较快主机致使较慢主机的缓冲区溢出) TCP 使用的流量控制协议是可变大小的滑动窗口协议。 8、TCP 还能提供拥塞控制。当网络拥塞时,减少数据的发送。

有两种技术可以运用。一种是由 TCP 协议层

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值