传输层的两个主要协议:TCP 和 UDP
UDP和TCP特点(部分)对比:
UDP:无连接, 不可靠传输, 面向数据报, 全双工。
TCP:有连接, 可靠传输, 面向字节流, 全双工。
UDP 和 TCP 有着两套不同的api, 操作系统给程序用于网络编程的api又起了另外的名字提叫:socket api。
有连接就如打电话,不仅需要打电话的人来拨号,也需要接电话的人来同意,这个过程就是建立连接。而无连接就如发短信,只需要知道对方的号码,就可以直接发短信,不需要对方的同意。
可靠传输与不可靠传输的可靠不是指A给B的信息能100%的到达,而是指A尽可能的把信息传给B,并且在传输过程中,A能感觉到是否传输成功,而TCP能感觉的到,UDP不行,虽然TCP是可靠传输,但这也因此导致传输效率降低了,而UDP的传输效率更高。可靠传输与不可靠传输并不是判断网络安全的标准之一,因此不能说TCP一定比UDP更安全。
TCP和文件操作类似,都是流式的,如水一样,可以一次取几十毫升,也可分几十次取一毫升,凭自己的想法决定,TCP传递消息也是如此,因此TCP是面向字节流,而UDP则不同,它是面向数据报的,它的读写的基本单位是一个UDP数据报,因此,它只能一次传输一个UDP数据报,而不能一次传输多个数据报或者半个数据报之类的。
全双工指的是一个通道,可以双向通信,就如在同一个通道里,A给B发信息时,B也能给A发信息,同时还有半双工,它指的是一个通道,只能单向通信。
UDP的socket api
两个核心类:
1)DatagramSocket
是一个Socket对象,操作系统使用文件的概率来管理一些软硬件资源,同样的,操作系统也使用文件的方式来表示网卡的,表示网卡的这类文件,称为Socket文件,JAVA中的Socket对象,就对应这系统里的Socket文件(最终还是得落在网卡上)。因此要进行网络对象,就必须得有Socket对象,然后通过网卡进行网络通信。
DatagramSocket类有两个构造方法,一个带端口号的(在服务器这边使用,端口号手动指定),一个不带端口号(在客户端使用,系统自动分配),为什么这么设置呢?如开餐厅,每次客人来吃时,只需要找到餐厅位置,但餐厅所处位置这有许多餐厅,要想与其他餐厅区分开来,就需要有一个与其他餐厅不同的名字,而这个名字就相当于服务器端口号,倘若这个名字会随着时间改变,那么如果有回头客时,就会找不到原来的餐厅,因为餐厅名发生改变,因此服务器的端口号是不能随意改变的,而顾客来餐厅吃时,也不是每次都在一个地方,而是哪有位置去哪,这个就是有系统自动分配的端口号,倘若手动指定位置,有可能该端口号已被占用,就无法进行交互,因此由系统自动分配是比较适合,所以,客户端的DatagramSocket类不带端口的。
除此之外,还提供了其他的方法:
2) DatagramPacket
表示了一个UDP数据报,代表了系统中设定的UDP数据报的二进制结构。同样也有两个构造方法:
TCP的socket api
两个核心类:
1)ServerSocket
给服务器使用的Socket
ServerSocket中会有一个“管理连接”的队列,当客户端和服务器尝试建立连接的时候,服务器就会和客户端进行一系列的数据交互,这个过程就称为握手,这个过程完了后,连接就建立好了,这个时候管理连接的队列里就会有这个连接元素,每有一个客户端与服务器建立连接,就会往这个队列添加一个元素。
2)Socket
服务器和客户端都要使用。