学习计算机网络(二)——TCP、UDP

问题

三次握手和四次挥手发生的时间、状态变化、填充信息、?

一、TCP

(一)三次握手

客户端主动建立连接,服务端被动连接
    1:客户端发送序号为x的数据,SYN置为1,状态SYNSEND。
    2:服务端接收到消息后,SYN = 1,ACK = 1,服务端处于SYN-RECIVE状态
    3:三次握手后,客户端处于ESTAB-LISTEND。服务端处于ESTBLISTEND状态。

(*)为什么是三次握手,不可以两次?

如果采用两次握手,那么只要服务器发出确认数据包就会建立连接。但是客户端此时并没有相应服务器端的请求,那次是的服务器端就会一直在等待客户端,这样会浪费一定资源。

如果采用三次握手,服务端没有收到客户端的确认就会知道客户端并没有要求简历请求,就不会浪费服务器的资源。

(二)四次挥手

    1:客户端主动发起关闭连接,FIN = 1。发出挥手后处于FIN-WAIT-1状态。
    2:服务端接收到挥手消息后,ACK = 1,服务端处于CLOSE-WAIT状态。
    3:客户端接收到挥手消息后,处于FIN-WAIT-2状态。此时客户端不能向服务端发送消息,但是服务端可以向客户端发送消息。服务端发送第三次挥手消息,FIN = 1。
    4:客户端接收到挥手消息后,开始发送第四次挥手消息,客户端处于TIME-WAIT状态,等待2*MSL时间后关闭。服务端接收到消息后关闭。

(*)四次挥手释放连接时,等待2MSL的意义?

(1)为了保证A发送的只有一个ACK报文段能够到达B。这个ACK文件有可能丢失,因此处在LAST-ACK状态的B会接收不到A对已发送的FIN和ACK报文段的确认。B会超时重传这个FIN和ACK报文段,而A就可以在2MSL时间内收到这个串串的ACK+FIN报文段。接着A就会再重新发送一次确认。

(2)防止上面提到的已经失效的连接请求报文段出现在本连接中,A在发送完最后一个ACK后,在经过2MSL就可以使本连接持续的时间内所产生的所有报文段从网络中消失。

(*)为什么建立连接是三次,断开连接四次?

这是由于TCP的半关闭造成的。因为TCP连接时全双工(即数据可以在两个方向上进行传输)的,所以进行关闭时每个方向都要进行单独关闭。这个单方向的关闭就叫做半关闭。当一方完成它的数据发送任务,就发送一个FIN向另一方通知将要终止这个方向的连接。

(*)TCP粘包/拆包原因及其解决办法?

TCP是基于字节流的,虽然应用层和TCP传输层之间的数据交互是大小不等的数据块,但是TCP把这些数据仅仅看成一连串无结构的字节流,没有边界。另外从TCP帧结构中也可看出,在TCP的首部没有表示数据长度的字段。

常见的原因:

(1)要发送的数据大于TCP发送缓冲区剩余空间的大小,将会发生拆包。

(2)待发送数据大于MSS(最大报文长度),TCP在发送数据前会将其进行拆包。

(3)要发送的数据小于TCP发送缓存区的大小,TCP将多次写入的数据一次发出,将会产生粘包。

(4)接收数据段的应用层没有及时读取接收缓存区中的数据,将会发生粘包。

解决问题的关键在于如何给每个数据包添加边界信息,常用的方法有:

(1)发送端给每个数据包添加首部,首部中至少包含数据包的长度。这样接收端在接收到数据后通过读取首部的长度字段,就可知道每个数据包的实际长度了。

(2)发送端将每个数据包封装为固定长度(不够可以通过补0填充),这样接收端每次从缓存区中读取固定长度的数据就自然地将每个数据包进行拆分。

(3)可以在数据包之间设置边界,如添加特殊字符号。这样接收端可以通过这个边界将不同的数据包拆分。

(三)数据可靠性的体现

    1、数据通信前进行连接,通信结束后释放链接。
    2、保证数据完全达到目的端:确认应答机制和超时重传机制
    3、接收数据有序
    4、数据的发送和接受都是相同的,通过头部校验和字段判断数据是否损坏,损坏则丢弃数据等待下一次发送。

(1)TCP如果保证可靠传输

(1)超时重传:超过时间无应答重传。

(2)滑动窗口:窗口用来缓存字节流,接收方和发送方都有,发送方发送数据的数据包中包含了窗口大小,使得两边窗口一致。

(3)流量控制:控制发送方的发送速度。

(4)拥塞控制:如果网络出现拥塞,分组就会丢失。此时发送方会继续重传,从而导致网络拥塞程度更高。因此当出现网络拥塞时应当控制发送方的速度。这一点和流量控制很像,但是出发点不同。流量控制是为了让接收方来得及接收,而拥塞控制是为了降低整个网络的拥塞程度。

二、UDP

使用(DatagramSocket)

不可靠(数据传输前不会进行连接)

报头?8字节

主要应用场景:直播、视频

三、TCP和UDP的区别?

    1、TCP是可靠的、面向连接的、流式服务。
          UDP是不可靠的、无连接的、数据报服务。
    2、应用场景不同:TCP适合消息可达性要求较高的应用场景,如微信。
         UDP适合传输效率高,可靠性性要求不高的应用场景,如视频。


    流式服务:数据是一条数据源,数据是没有界限的,发送次数和接受次数无直接关系。
        特点:
    数据报式服务:
        特点:发送数据和接收数据的次数是相等的,如果接收方不能一次读取数据,则剩余的数据丢弃掉。

四、网络编程

网络基于C/S模型:客户端(Client)、服务端(Server)

TCP交互步骤:

socket(IP + 端口)

端口:是传输层和应用层的服务接口,用于寻找发送端和接收端的进程。

一般来讲,通过端口号和IP地址可以唯一确定一个TCP连接。在网络编程中通常称为一个Socket接口。

服务端 客户端
bind(端口)  
  connect(连接IP + 端口)
listen(监听状态)  
accept(返回和客户端连接的实例)  
read / write(读写) read / write(读写)
close(关闭资源) close(关闭资源)
   

服务端代码:

package review.tcpudp.tcp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;


public class Server {
    public static void main(String[] args) throws IOException {
        //创建ServerSocket实例
        ServerSocket ss = new ServerSocket();
        //绑定端口
        ss.bind(new InetSocketAddress(8888));
        //监听并获得socket
        Socket accept = ss.accept();
        //进行读写操作
        BufferedReader reader = new BufferedReader(new InputStreamReader(accept.getInputStream()));
        String msg = null;
        while((msg = reader.readLine()) != null) {
            System.out.println(msg);
        }
        //关闭资源
        reader.close();
        accept.close();
        ss.close();
    }
}

客户端代码:

package review.tcpudp.tcp;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;


public class Client {
    public static void main(String[] args) throws IOException {
        //创建Socket实例
        Socket socket = new Socket();
        //连接服务器
        socket.connect(new InetSocketAddress("127.0.0.1",8888));
        //发送消息
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("hello\n".getBytes());
        //关闭资源
        socket.close();
    }
}

(*注意)客户端连接服务端的前提是服务端必须先启动。

五、TCP头部信息字段释义

  字节数  
源端口号、目的端口号 各占2字节 用于寻找发送端和接收端的进程。
序号 4 用来标识从TCP发送端向TCP接收端发送的数据字节流。
确认序号 4 包含发送确认一端所希望收到的下一个序号。
数据偏移 4 用于支出TCP首部长度,若不存在选项,则这个值为20字节。数据偏移量的最大值为60字节。
保留字段 6 暂时可忽略,值全为0.
标志位    
接收窗口 2

用于流量控制和拥塞控制,表示当接收缓冲区的大小。

在计算机网络中,通常是用接收方的接收能力大小来控制发送方的数据发送量。TCP连接的一端根据缓冲区大小确定自己的接收窗口值,告诉对方,使对方可以确定发送数据的字节数。

校验和 2 范围包括首部和数据两部分。

标志位:

  为1时表明
URG(紧急) 紧急指针字段有效。
ACK(确认) 确认号字段有效。
PSH(推送) 接收方应尽快将这个报文交给应用层。
RST(复位) TCP连接出现故障,必须重新建立连接。
SYN(同步) 在建立连接时用来同步序号。
FIN(终止) 发送端数据发送完毕,要求释放连接。

 

 

 

 

 

你可能感兴趣的:(计网)