java tcp 三次握手_用Java代码分析TCP的三次握手四次挥手过程
(1)客户端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的报文1。
(2) 服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标志。因此它表示对刚才客户端SYN报文的回应;同时又标志SYN给客户端,询问客户端是否准备好进行数据通讯。
(3) 客户必须再次回应服务段一个ACK报文,这是报文段3。
TCP的三次握手可以通过报文来分析:
(1)客户端向服务器端发起同步请求,服务器侧端口固定为 102,客户端端口由 socket 随机产生
(2)服务器端向客户端响应,同时也向客户端发起同步请求
(3)客户端予以确认
2 连接终止协议(四次挥手)
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
(1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送(报文段4)。
(2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。
(3) 服务器关闭客户端的连接,发送一个FIN给客户端(报文段6)。
(4) 客户段发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。
通过Java代码实现TCP连接三次握手和四次挥手的过程:
package com.zhaoming.test;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ClientConnect extends Thread
{
//定义一个Client的对象
private Client client;
private Socket socket;
//定义IP和端口号是常量
private static final String IP = "192.168.1.190";
private static final int PORT = 20108;
//声明str是一个静态变量,
public static String str = null;
//进行构造(持有另一个类对象的引用)
public ClientConnect(Client client)
{
this.client = client;
}
//启用线程,处理连接
public void run()
{
try
{
//初始化要连接的socket套接字
socket = new Socket(IP,PORT);
client.getjButton1().setEnabled(false);
}
catch (UnknownHostException e1)
{
e1.printStackTrace();
}
catch (IOException e1)
{
e1.printStackTrace();
}
//从服务器端通过socket读取信息
BufferedReader br = null;
try
{
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//把读到的信息显示到TextArea中
while (true)
{
str = br.readLine();
client.getjTextArea1().append(str + "\n");
//建一个新的文本文档,用于存储从服务器读到的信息
File file = new File("E:/temperatrue.txt");
PrintWriter out = null;
String date = null;
//修改时间显示的格式
SimpleDateFormat sdf = null;
try
{
//把读到的信息,写到到文本文件中存储起来
out = new PrintWriter(new FileOutputStream(file, true));
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
date = sdf.format(new Date());
out.println(date+"\t"+str);
out.flush();
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
finally
{
out.close();
}
}
} catch (IOException e)
{
e.printStackTrace();
}
//进行流关闭处理,先进行判断,然后再关闭
finally
{
try
{
if(br != null)
{
br.close();
br =null;
}
if(socket != null)
{
socket.close();
socket = null;
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。 TCP协议的连接是全双工连接,一个TCP连接存在双向的读写通道。 简单说来是 “先关读,后关写”,一共需要四个阶段。以客户机发起关闭连接为例: 1.服务器读通道关闭 2.客户机写通道关闭 3.客户机读通道关闭 4.服务器写通道关闭 关闭行为是在发起方数据发送完毕之后,给对方发出一个FIN(finish)数据段。直到接收到对方发送的FIN,且对方收到了接收确认ACK之后,双方的数据通信完全结束,过程中每次接收都需要返回确认数据段ACK。
java tcp 三次握手_用Java代码分析TCP的三次握手四次挥手过程相关推荐
- java tcp 阻塞等待应答_面试常问!TCP 的三次握手与四次挥手理解
来源:青柚_ blog.csdn.net/qq_38950316/article/details/81087809 三次握手过程理解 四次挥手过程理解 常见面试题 先来张图! 序列号seq: 占4个字 ...
- mysql三次握手_一文彻底搞懂 TCP三次握手、四次挥手过程及原理
原创文章首发于公众号:「码农富哥」,欢迎收藏和关注,如转载请注明出处! TCP 协议简述 TCP 提供面向有连接的通信传输,面向有连接是指在传送数据之前必须先建立连接,数据传送完成后要释放连接. 无论 ...
- go tcp客户端自动重连_阿里面试: HTTP、HTTPS、TCP/IP、三次握手四次挥手过程?(附全网最具深度讲解)
前言 这段时间面试官都挺忙的,频频出现在博客文章标题,虽然我不是特别想蹭热度,但是实在想不到好的标题了-.-,蹭蹭就蹭蹭 :) 事实上我在阿里面试的时候确实被问到了这个问题,HTTP.HTTPS.TC ...
- 经典面试题之 TCP三次握手 和 TCP四次挥手过程----详解
TCP三次握手过程: 第一次握手:建立连接时,客户端发送syn包(seq=j)到服务器,并进入SYN_SENT状态,等待服务器确认:SYN:同步序列编号(Synchronize Sequence Nu ...
- 深入理解TCP三次握手与四次挥手过程以及抓包实验
一.前言 最近,我正好在做socket相关的实验,发现现在对计算机网络知识有一点点模糊,借此机会,熟悉一下TCP连接过程并利用WireShark工具进行测试. 二.TCP报文首部 源端口号:占16比特 ...
- TCP三次握手、四次挥手过程及原理
TCP 协议简述 TCP 提供面向有连接的通信传输,面向有连接是指在传送数据之前必须先建立连接,数据传送完成后要释放连接. 无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接.在TCP/I ...
- TCP三次握手和四次挥手过程
1.三次握手 (1)三次握手的详述 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源.Client端接收到ACK报文后也向Server段发生ACK报文, ...
- 【源码+图片素材】Java王者荣耀游戏开发_开发Java游戏项目【王者荣耀】1天搞定!!!腾讯游戏_Java课程设计_Java实战项目_Java初级项目
王者荣耀是当下热门手游之一,小伙伴们是否想过如何制作一款属于自己的王者荣耀游戏呢? 本课程讲解了一个王者荣耀游戏的详细编写流程,即使你是刚入门Java的新手,只要你简单掌握了该游戏所需要的JavaSE ...
- TCP原理和三次握手和四次挥手过程
TCP原理和三次握手和四次挥手过程 TCP原理和三次握手和四次挥手过程 TCP是什么?有什么作用? 三次握手 连接建立 详细过程 四次挥手 连接终止 详细过程 参考 TCP原理和三次握手和四次挥手过程 ...
- 三次握手与四次挥手过程详解
三次握手与四次挥手过程详解 三次握手建立连接: 传输数据过程: 四次握手断开连接: 常见面试问题: TCP通信过程包括三个步骤:建立TCP连接通道,传输数据,断开TCP连接通道 上图主要包括三部分:建 ...
最新文章
- 计算几何题中的英语生词
- 实现大规模图计算的算法思路
- jquery eaayui 学习(三)tab
- DJANGO用户名认证一例
- 第 1 节: 1-文本自增演示HttpHandler不记忆状态
- 利用gcc的__attribute__编译属性section子项构建初始化函数表【转】
- ajax请求后台报没有body_前端常见面试 - 请求篇
- HDU - 6333 Problem B. Harvest of Apples(莫队变形+思维+组合数学,好题)
- js 操作java对象_JavaScript 对象基础
- Struts2上传文件的大小设置
- PyCharm 通过Github和Git上管理代码
- html标记的索引,基于HTML标记分析及中文切词的网页索引研究与实现
- 将String数组转换到Double数组
- Android Gradle配置构建
- “广” “专”的抉择 -- 个人技术发展之我见!
- 弯管机编程软件电脑版_编程一点通电脑版
- Unity MasterServer主服务器
- 计算机网络基础肖盛文电子书,网络实用教程
- 升级版的冒泡排序Java
- 经典仿句100例_仿写句子_二年级仿写句子100例
热门文章
- pandas使用query函数查询指定日期索引之间对应的dataframe数据行(select rows date index between a certain date interval)
- R语言e1071包中的支持向量机:仿真数据(螺旋线性不可分数据集)、简单线性核的支持向量机SVM(模型在测试集上的表现、可视化模型预测的结果、添加超平面区域与原始数据标签进行对比分析)、如何改进核函数
- pandas判断日期是否是闰年(is_leap_year)实战: 数据列转化为日期(时间)格式、判断pandas的日期数据列是否是闰年
- 词袋模型(bag of words)构建并使用主题模型(topic models)特征进行文本聚类分析(clustering analysis)实战
- 生物信息学 生物科学、农学、林学、医学
- win10 c盘清理_win10 C盘爆红怎么清理?
- tensorflow GPU python cuda cudnn 匹配
- java普通项目打包成exe可执行文件
- 【建站系列教程】3、建站基本技术介绍
- 过拟合的原因以及解决办法(深度学习)