关于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
package socket; import java.io.*;
import java.net.*;
import java.util.Date; public class TCPClient { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
System.out.println(new Date());
InetAddress remoteAddress = InetAddress.getByName("22.11.143.60");
// InetAddress localAddress = InetAddress.getByName("127.0.0.1");
// Socket socket = new Socket(remoteAddress, 1287, localAddress, 1288);
// Socket socket = new Socket(remoteAddress, 1287);
Socket socket = new Socket ();
socket.connect(new InetSocketAddress(remoteAddress,1287), 1000);
socket.setSoTimeout(110000);
System.out.println(new Date());
PrintWriter os = new PrintWriter(socket.getOutputStream());
BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String msg = "hello";
os.println(msg);
os.flush();
System.out.println("Client: " + msg);
// Thread.sleep(1000);
System.out.println("Server: " + is.readLine());
System.out.println(new Date());
Thread.sleep(1000000);
System.out.println("end!");
os.close();
is.close();
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
System.out.println(new Date());
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println(new Date());
e.printStackTrace();
}
catch (InterruptedException e) {
// TODO Auto-generated catch block
System.out.println(new Date());
e.printStackTrace();
} } }
TCPServer.java
package socket; import java.io.*;
import java.net.*; public class TCPServer { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
ServerSocket serverSocket = new ServerSocket(1287,2);
Socket socket = serverSocket.accept(); PrintWriter os = new PrintWriter(socket.getOutputStream());
BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true){
System.out.println("Client: " + is.readLine());
String msg = "hi";
os.println(msg);
os.flush();
System.out.println("Server: " + msg);
}
// os.close();
// is.close();
// socket.close();
// serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } } }
UDPClient.java
package socket; import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException; public class UDPClient { public static void main(String[] args) {
try {
DatagramSocket ds = new DatagramSocket();
String str = "hello";
DatagramPacket dp = new DatagramPacket(str.getBytes(),str.length(),InetAddress.getByName("22.11.143.60"),1287);
ds.send(dp); ds.close(); } catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} } }
UDPServer.java
package socket; import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException; public class UDPServer { public static void main(String[] args) { try {
DatagramSocket ds = new DatagramSocket(1287);
byte[] buf=new byte[100];
DatagramPacket dp=new DatagramPacket(buf,100);
ds.receive(dp);// block here
System.out.println(new String(dp.getData())); ds.close(); } catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} } }
关于TCP/IP协议栈的更多相关文章
- 【转】TCP/IP协议栈及OSI参考模型详解
OSI参考模型 OSI RM:开放系统互连参考模型(open systeminterconnection reference model) OSI参考模型具有以下优点: 简化了相关的网络操作: 提供设 ...
- C1000k 新思路:用户态 TCP/IP 协议栈
现在的服务器支撑上百万个并发 TCP 连接已经不是新闻(余锋2010年的演讲,ideawu 的 iComet 开源项目,WhatsApp 做到了 2.5M).实现 C1000k 的常规做法是调整内核参 ...
- 渣渣小本求职复习之路每天一博客系列——TCP/IP协议栈(5)
前情回顾:一篇短短的博客明显不能满足TCP和UDP这两个饥渴的汉子,而且还被应用协议占了一小半的篇幅.在昨天结束之后,相信大家都基本对TCP/IP协议栈的轮廓有一个大概的印象了,能够对整体有所把握. ...
- TCP/IP协议栈概述
TCP/IP协议栈概述 这篇文章虽然只是很粗浅的介绍了ISO/OSI 网络模型,但确实把握住了关键点,某种意义上,简单回顾一下就可以加深对TCP/IP协议栈的理解. 原作者:阮一峰 链接: http: ...
- [转]为何TCP/IP协议栈设计成沙漏型的
http://m.blog.csdn.net/blog/dog250/18959371 前几天有人回复我的一篇文章问,为何TCP/IP协议栈设计成沙漏型的.这个问题问得好!我先不谈为何它如此设计,我一 ...
- windows下重新安装TCP/IP协议栈
一.windows重装TCP/IP协议 前两天在windows下安装开发环境的时候,把系统的TCP/IP协议栈给搞跪了,导致系统无法ping localhost.无法在程序中创建socket等 ...
- UNIX/Linux网络编程基础:图解TCP/IP协议栈
目录 1.主机到网络层协议:以太网协议 2.IP协议 3.网际控制报文协议(ICMP) 4.传输控制协议(TCP) 5.用户数据报文协议(UDP) 6.流控制传输协议(SCTP) 7.地址解析协议(A ...
- TCP/IP协议栈与数据包封装+TCP与UDP区别
ISO制定的OSI参考模型的过于庞大.复杂招致了许多批评.与此对照,由技术人员自己开发的TCP/IP协议栈获得了更为广泛的应用.如图2-1所示,是TCP/IP参考模型和OSI参考模型的对比示意图. T ...
- TCP/IP协议栈及OSI参考模型详解
OSI参考模型 OSI RM:开放系统互连参考模型(open systeminterconnection reference model) OSI参考模型具有以下优点: 简化了相关的网络操作: 提供设 ...
- TCP/IP协议栈源码图解分析系列10:linux内核协议栈中对于socket相关API的实现
题记:本系列文章的目的是抛开书本从Linux内核源代码的角度详细分析TCP/IP协议栈内核相关技术 轻松搞定TCP/IP协议栈,原创文章欢迎交流, byhankswang@gmail.com linu ...
随机推荐
- iOS 开发新版 动态库framework
0. 参考 http://www.cocoachina.com/industry/20140613/8810.html framework+xib参考 : http://blog.csdn.net/x ...
- Mac 修改用户名
系统偏好设置 > 用户与群组 > 解锁 > 用户 > 右键 > 高级选项 > 全名
- Android应用的基本组件介绍和签名Android应用程序
一.Android应用的基本组件介绍 Activity和View :Activity只能通过setContentView(View)来显示指定的组件.View组件是所有UI控件.容器控件的基类,Vi ...
- SVN官方版本下载地址
TortoiseSVN 客户端 & Language packs 语言包 : https://tortoisesvn.net/downloads.html VisualSVN 插件官方地址: ...
- javascript获取整数随机数
javascript获取整数随机数 // 从4到10的随机数,|0是生成正整数 var numBars = Math.random()*6+4|0; 也可以通过右移0位(或者左移0位)进行取整 var ...
- 介绍一个开源的在线管理SQLServer的小工具--SQLEntMan
近来有许多人问起SQL在线管理的问题,遂将以前用过的一个开源SQL 在线管理工具修改了一下,并分享. 看下效果图: 原项目的地址:http://sourceforge.net/projects/asp ...
- C# winform项目中ListView控件使用CheckBoxes属性实现单选功能
C# winform项目中ListView控件使用CheckBoxes属性实现单选功能 在做项目时需要使用ListView控件的CheckBoxes属性显示,还要在点击行时自动选中CheckBoxes ...
- 记一次企业级爬虫系统升级改造(五):基于JieBaNet+Lucene.Net实现全文搜索
实现效果: 上一篇文章有附全文搜索结果的设计图,下面截一张开发完成上线后的实图: 基本风格是模仿的百度搜索结果,绿色的分页略显小清新. 目前已采集并创建索引的文章约3W多篇,索引文件不算太大,查询速度 ...
- .Net程序员学用Oracle系列(12):增删改查
1.插入语句 1.1.INSERT 1.2.INSERT ALL 2.删除语句 2.1.DELETE 2.2.TRUNCATE 3.更新语句 3.1.UPDATE 3.2.带子查询的 UPDATE 3 ...
- C++编程练习(2)----“实现简单的线性表的链式存储结构“
单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素. 对于查找操作,单链表的时间复杂度为O(n). 对于插入和删除操作,单链表在确定位置后,插入和删除时间仅为O(1). 单链表不需要分配存储 ...