关于TCP/IP协议栈(转)

1. TCP/IP协议栈

与OSI参考模型不同,TCP/IP协议栈共有4层,其中网络接口层对应OSI中的物理层和数据链路层,应用层对应OSI中的应用层、表示层和会话层。

在网络接口层的主要协议有:ARP、RARP等。ARP协议主要功能是根据IP地址获取物理地址,RARP协议则反之。

网络层的主要协议有:IP、路由协议(RIP、OSPF、BGP等)。IP协议为网络上的每台主机编号,在此基础上才有路由协议,因此路由协议是基于IP协议的。

传输层的主要协议有:TCP、UDP。传输层有端口号的概念,端口号是指TCP或UDP协议能根据端口号找到接受数据包的进程。(也就是说一个TCPServer和一个UDPServer可以绑定同一个端口,详细解释参看第2节)

应用层协议主要有:HTTP、FTP、SMTP等。

 

2. “协议号+端口号”唯一确定了接收数据包的进程

协议号:协议号是存在于IP数据报的首部的20字节的固定部分,占有8bit。该字段是指出此数据报所携带的是数据是使用何种协议,以便目的主机的IP层知道将数据部分上交给哪个传输层协议(TCP/UDP等)。

端口号:端口号存在于TCP/UDP报文的首部。

目的主机收到数据报后,IP协议会将解析到协议号,并据此将数据上送给相应的传输层协议;传输层协议收到数据并解析,获得端口号,并据此将数据上送给相应的接受数据报的进程。

从上述过程可知,端口号是按照传输层协议号划分了“命名空间”的,因此,同一主机可以同时运行绑定同一端口号的TCP Socket(java中对应ServerSocket、Socket)和UDP Socket(java中对应DatagramSocket)而不发生冲突。

3. 附件

测试使用的代码:

TCPClient.java

 1 package socket;
 2
 3 import java.io.*;
 4 import java.net.*;
 5 import java.util.Date;
 6
 7 public class TCPClient {
 8
 9     /**
10      * @param args
11      */
12     public static void main(String[] args) {
13         // TODO Auto-generated method stub
14         try {
15             System.out.println(new Date());
16             InetAddress remoteAddress = InetAddress.getByName("22.11.143.60");
17 //            InetAddress localAddress = InetAddress.getByName("127.0.0.1");
18 //            Socket socket = new Socket(remoteAddress, 1287, localAddress, 1288);
19 //            Socket socket = new Socket(remoteAddress, 1287);
20             Socket socket = new Socket ();
21             socket.connect(new InetSocketAddress(remoteAddress,1287), 1000);
22             socket.setSoTimeout(110000);
23             System.out.println(new Date());
24             PrintWriter os = new PrintWriter(socket.getOutputStream());
25             BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
26             String msg = "hello";
27             os.println(msg);
28             os.flush();
29             System.out.println("Client: " + msg);
30 //            Thread.sleep(1000);
31             System.out.println("Server: " + is.readLine());
32             System.out.println(new Date());
33             Thread.sleep(1000000);
34             System.out.println("end!");
35             os.close();
36             is.close();
37             socket.close();
38         } catch (UnknownHostException e) {
39             // TODO Auto-generated catch block
40             System.out.println(new Date());
41             e.printStackTrace();
42         } catch (IOException e) {
43             // TODO Auto-generated catch block
44             System.out.println(new Date());
45             e.printStackTrace();
46         }
47         catch (InterruptedException e) {
48             // TODO Auto-generated catch block
49             System.out.println(new Date());
50             e.printStackTrace();
51         }
52
53     }
54
55 }

TCPServer.java

 1 package socket;
 2
 3 import java.io.*;
 4 import java.net.*;
 5
 6 public class TCPServer {
 7
 8     /**
 9      * @param args
10      */
11     public static void main(String[] args) {
12         // TODO Auto-generated method stub
13         try {
14             ServerSocket serverSocket = new ServerSocket(1287,2);
15             Socket socket = serverSocket.accept();
16
17             PrintWriter os = new PrintWriter(socket.getOutputStream());
18             BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
19             while (true){
20                 System.out.println("Client: " + is.readLine());
21                 String msg = "hi";
22                 os.println(msg);
23                 os.flush();
24                 System.out.println("Server: " + msg);
25             }
26 //            os.close();
27 //            is.close();
28 //            socket.close();
29 //            serverSocket.close();
30         } catch (IOException e) {
31             // TODO Auto-generated catch block
32             e.printStackTrace();
33         }
34 //        catch (InterruptedException e) {
35 //            // TODO Auto-generated catch block
36 //            e.printStackTrace();
37 //        }
38
39     }
40
41 }    

UDPClient.java

 1 package socket;
 2
 3 import java.io.IOException;
 4 import java.net.DatagramPacket;
 5 import java.net.DatagramSocket;
 6 import java.net.InetAddress;
 7 import java.net.SocketException;
 8 import java.net.UnknownHostException;
 9
10 public class UDPClient {
11
12     public static void main(String[] args) {
13         try {
14             DatagramSocket ds = new DatagramSocket();
15             String str = "hello";
16             DatagramPacket dp = new DatagramPacket(str.getBytes(),str.length(),InetAddress.getByName("22.11.143.60"),1287);
17             ds.send(dp);
18
19             ds.close();
20
21         } catch (SocketException e) {
22             e.printStackTrace();
23         } catch (UnknownHostException e) {
24             e.printStackTrace();
25         } catch (IOException e) {
26             e.printStackTrace();
27         }
28
29     }
30
31 }

UDPServer.java

 1 package socket;
 2
 3 import java.io.IOException;
 4 import java.net.DatagramPacket;
 5 import java.net.DatagramSocket;
 6 import java.net.SocketException;
 7
 8 public class UDPServer {
 9
10     public static void main(String[] args) {
11
12         try {
13             DatagramSocket ds = new DatagramSocket(1287);
14             byte[] buf=new byte[100];
15             DatagramPacket dp=new DatagramPacket(buf,100);
16             ds.receive(dp);// block here
17             System.out.println(new String(dp.getData()));
18
19             ds.close();
20
21         } catch (SocketException e) {
22             e.printStackTrace();
23         } catch (IOException e) {
24             e.printStackTrace();
25         }
26
27
28     }
29
30 }

 

http://www.cnblogs.com/kqdongnanf/p/4773539.html

 

 

时间: 2024-11-03 22:19:07

关于TCP/IP协议栈(转)的相关文章

数据在协议栈中的传递-用原始套接字截取数据链路层数据,那这包数还会在TCP/IP协议栈中传递吗

问题描述 用原始套接字截取数据链路层数据,那这包数还会在TCP/IP协议栈中传递吗 用原始套接字写了一个小程序,装在本机后,能够截取本机的发送/接收数据,想问一下,比如原始套接字程序在数据链路层截取到一个别人发给本机的数据,原始套接字程序截取到后,这包数还会向网络层上传,一步步再送到截取这包数的真正端口进程吗?会不会我一截取,该收到这包数的进程就收不到了呢? 解决方案 看你怎么截取的,一般是拦截,不影响数据包的发送. 解决方案二: 如果你不是通过驱动等,很可能你拿到的只是一份拷贝,所以数据还是继

结合Wireshark捕获分组深入理解TCP/IP协议栈

摘要:     本文剖析了浏览器输入URL到整个页面显示的整个过程,以百度首页为例,结合Wireshark俘获分组进行详细分析整个过程,从而更好地了解TCP/IP协议栈.   一.俘获分组 1.1 准备工作 (1) 清空浏览器缓存     首先清空Web浏览器的高速缓存,确保Web网页是从网络中获取,而不是从高速缓冲取得[1].谷歌浏览器,Options --> Under the Hood --> Clear browsing data. (2)清空DNS缓存     在客户端清空DNS高速

《IP组播(第1卷)》一1.4 三层组播是建立在TCP/IP协议栈中的

1.4 三层组播是建立在TCP/IP协议栈中的 IP组播是建立在TCP/IP协议栈中的.也就是说,传输组播数据帧和数据包所需的协议是由Internet工程任务组(IETF)进行控制的.IETF成员通过RFC发布和管理相关协议,也就是说IP组播协议是开放标准. 注释 组播协议IETF标准适用于IPv4和IPv6组播技术:但和其他IP协议一样,这并不意味着所有厂商处理组播的方式都是相同的,同时也不意味着所有组播协议的实施都能够与标准完美兼容. 使用TCP/IP协议栈也意味着IP组播隶属于互联网数字分

使用TCP/IP协议栈指纹进行远程操作系统辨识_网络冲浪

概述 本文讨论了如何查询一台主机的TCP/IP协议栈来收集宝贵的信息.首先,我列举了栈指纹之外的几种"经典的"操作系统辨识方法.然后我描述了栈指纹工具的"工艺现状".接下来说明让远程主机泄漏其信息的一些技术.最后详述了我的实现(nmap),和用它获得的一些流行网站的操作系统信息.理由热点网络 我认为辨识一个系统所运行OS的用处是相当显而易见的,所以这一节会很短.最有力的例子之一是许多安全漏洞是OS相关的.试想你正在作突破试验并发现53端口是打开的.如果那是易遭攻击的

TCP/IP协议栈遭遇攻击?!

我们的网络游戏采用tcp进行通信,服务端程序绑定8300端口,为游戏客户端提供服务,游戏已经上线稳定运行两年多,从今年9月份开始至今碰到了3次攻击,3次攻击所导致的情况一样,描述如下: (1)从应用层上来看,攻击者每次攻击时,与8300端口都有建立最多两.三百个tcp连接. (2)从防火墙监控来看,攻击的流量非常微小,以至于防火墙的流量报警都未触发. (3)每次攻击产生时,原先的玩家的tcp连接并未断开(应用程序未抛出TCP连接断开的异常),但服务端的再也接收不到来自客户端的任何消息.服务端进程

linux网络编程之TCP/IP基础(一) TCP/IP协议栈与数据包封装

一.ISO/OSI参考模型 OSI(open system interconnection)开放系统互联模型是由ISO(International Organization for Standardization)国际标准化组织定义的网络分层模型,共七层,如下图. 物理层(Physical Layer):物 理层定义了所有电子及物理设备的规范,为上层的传输提供了一个物理介质,本层中数据传输的单位为比特(bit).属于 本层定义的规范有EIA/TIA RS-232.EIA/TIA RS-449.V

结合Wireshark捕获分组深入理解TCP/IP协议栈之TCP协议(TCP报文格式+三次握手实例)

摘要:     本文简单介绍了TCP面向连接理论知识,详细讲述了TCP报文各个字段含义,并从Wireshark俘获分组中选取TCP连接建立相关报文段进行分析.   一.概述     TCP是面向连接的可靠传输协议,两个进程互发数据之前需要建立连接,这里的连接只不过是端系统中分配的一些缓存和状态变量,中间的分组交换机不维护任何连接状态信息.连接建立整个过程如下(即三次握手协议): 首先,客户机发送一个特殊的TCP报文段: 其次,服务器用另一个特殊的TCP报文段来响应: 最后,客户机再用第三个特殊报

Linux TCP/IP协议栈关于IP分片重组的实现

最近学习网络层协议的时候,注意到了IP协议中数据包分片的问题.下图是IP协议头的数据字段的示意: 如图所示,IP协议理论上允许的最大IP数据报为65535字节(16位来表示包总长).但是因为协议栈网络层下面的数据链路层一般允许的帧长远远小于这个值,例如以太网的MTU(即Maximum Transmission Unit,最大传输单元)通常在1500字节左右.所以较大的IP数据包会被分片传递给数据链路层发送,分片的IP数据报可能会以不同的路径传输到接收主机,接收主机通过一系列的重组,将其还原为一个

TCP/IP协议栈实现

博学,切问,近思--詹子知(http://blog.csdn.net/zhiqiangzhan)  发送数据:     入栈用户数据     入栈TCP头     入栈IP头     入栈MAC头     通过网卡发送.   接受数据:     网卡获得数据     弹出MAC头     弹出IP头     弹出TCP头     弹出用户数据.     用栈的结构实现的好处很明显, 用户在使用的时候, 无需关心网络数据的物理形式, 只需按照栈的操作就可以得到不同的协议层的信息(发送的时候也一样)