基础
- 目标:
- 了解七层模型的每层,用来做什么
- TCP三次握手和四次挥手
OSI七层网络模型
- 物理层:物理媒体部分
- 数据链路层:数据通道
- 网络层:将网络地址翻译成对应物理地址
IP协议在这一层;单位:数据包 - 传输层:通信部份最高层,用户功能的最低层;有重要的协议:TCP传输控制协议与UDP用户数据报协议;单位:数据段;
- 会话层:在网络中两节点之间建立、维持和终止通信;
- 表示层:对来自应用层的命令和数据进行解释,对语法赋予相应含义,按一定格式传送给会话层;
-应用层:OSI参考模型的最高层,为用户应用程序提供网络服务; - 总之可以这样子说
- 下面4层(物理层、数据链路层、网络层和传输层)主要提供数据传输和交换功能, 即以节点到节点之间的通信为主;
- 第4层作为上下两部分的桥梁,是整个网络体系结构中最关键的部分;
- 上3层(会话层、表示层和应用层)则以提供用户与应用程序之间的信息和数据处理功能为主。
- 即下四层主要完成通信子网的功能;上三层主要完成资源子网的功能;
TCP/IP四层模型
image.pngTCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。 TCP/IP协议簇分为四层,IP位于协议簇的第二层(对应OSI的第三层),TCP位于协议簇的第三层 (对应OSI的第四层)。TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供 的网络来完成自己的需求。这4层分别为:
- 应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、 网络远程访问协议(Telnet)等。
- 传输层:在此层中,它提供了节点间的数据传送服务,如传输控制协议(TCP)、 用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中, 这一层负责传送数据,并且确定数据已被送达并接收。
- 网络互连层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目 的主机(但不检查是否被正确接收),如网际协议(IP)。
- 主机到网络层:对实际的网络媒体的管理,定义如何使用实际网络 (如Ethernet、Serial Line等)来传送数据。
TCP/UDP区别
IP地址
终端的唯一标识是IP地址
端口
- 用于区分不同的应用程序
- 端口号的范围为0-65535,其中0-1023未系统的保留端口,我们的程序尽可能别使用这些端口!
- IP地址和端口号组成了我们的Socket,Socket是网络运行程序间双向通信链路的终结点, 是TCP和UDP的基础!
- 常用协议使用的端口:HTTP:80,FTP:21,TELNET:23
比较
- TCP/IP是一个协议簇,包含很多协议;UDP包含其中;
- TCP协议流程
TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议,即在收发数据线 ,都需要与对面建立可靠的链接,这也是面试经常会问到的TCP的三次握手以及TCP的四次挥手! 三次握手: 建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立, 在Socket编程中,这一过程由客户端执行connect来触发,具体流程图如下:
image.png
- 第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server, Client进入SYN_SENT状态,等待Server确认。
- 第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位 SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求 ,Server进入SYN_RCVD状态。
- 第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK 置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则 连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以 开始传输数据了。
- 四次挥手
终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。 在Socket编程中,这一过程由客户端或服务端任一方执行close来触发,具体流程图如下:
image.png
- 第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入 FIN_WAIT_1状态
- 第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同, 一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
- 第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK 状态。
第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。 另外也可能是同时发起主动关闭的情况:
image.png
- UDP
UDP(User Datagram Protocol)用户数据报协议,非连接的协议,传输数据之前源端和终端不 建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。 在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽 的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。 相比TCP就是无需建立链接,结构简单,无法保证正确性,容易丢包
实例
使用socket连接到指定主机
- net Socket类的getInetAddress()方法来连接到指定主机
感觉好神奇,首先catch语句???
然后是getInetAddress(),为什么感觉没有方法,就直接引用了???
import java.net.InetAddress;
import java.net.Socket;
public class Webping{
public static void main(String[] args){
try{
InetAddress addr;
Socket sock = new Socket("www.runoob.com", 80);
addr = sock.getInteAddress();
System.out.println("连接到“+ addr);
sock.close();
}catch(java.io.IOException e){
Sysytem.out.println("无法连接" + args[0]):
System.out.println(e);
}
}
}
-
结果
image.png
socket实现多线程服务器程序
import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
public class MultiThreadServer implements Runnable {
Socket csocket;
MultiThreadServer(Socket csocket) {
this.csocket = csocket;
}
public static void main(String args[])
throws Exception {
ServerSocket ssock = new ServerSocket(1234);
System.out.println("Listening");
while (true) {
Socket sock = ssock.accept();
System.out.println("Connected");
new Thread(new MultiThreadServer(sock)).start();
}
}
public void run() {
try {
PrintStream pstream = new PrintStream
(csocket.getOutputStream());
for (int i = 100; i >= 0; i--) {
pstream.println(i +
" bottles of beer on the wall");
}
pstream.close();
csocket.close();
}
catch (IOException e) {
System.out.println(e);
}
}
}
-
结果
image.png
网友评论