(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的三次握手四次挥手过程相关推荐

  1. java tcp 阻塞等待应答_面试常问!TCP 的三次握手与四次挥手理解

    来源:青柚_ blog.csdn.net/qq_38950316/article/details/81087809 三次握手过程理解 四次挥手过程理解 常见面试题 先来张图! 序列号seq: 占4个字 ...

  2. mysql三次握手_一文彻底搞懂 TCP三次握手、四次挥手过程及原理

    原创文章首发于公众号:「码农富哥」,欢迎收藏和关注,如转载请注明出处! TCP 协议简述 TCP 提供面向有连接的通信传输,面向有连接是指在传送数据之前必须先建立连接,数据传送完成后要释放连接. 无论 ...

  3. go tcp客户端自动重连_阿里面试: HTTP、HTTPS、TCP/IP、三次握手四次挥手过程?(附全网最具深度讲解)

    前言 这段时间面试官都挺忙的,频频出现在博客文章标题,虽然我不是特别想蹭热度,但是实在想不到好的标题了-.-,蹭蹭就蹭蹭 :) 事实上我在阿里面试的时候确实被问到了这个问题,HTTP.HTTPS.TC ...

  4. 经典面试题之 TCP三次握手 和 TCP四次挥手过程----详解

    TCP三次握手过程: 第一次握手:建立连接时,客户端发送syn包(seq=j)到服务器,并进入SYN_SENT状态,等待服务器确认:SYN:同步序列编号(Synchronize Sequence Nu ...

  5. 深入理解TCP三次握手与四次挥手过程以及抓包实验

    一.前言 最近,我正好在做socket相关的实验,发现现在对计算机网络知识有一点点模糊,借此机会,熟悉一下TCP连接过程并利用WireShark工具进行测试. 二.TCP报文首部 源端口号:占16比特 ...

  6. TCP三次握手、四次挥手过程及原理

    TCP 协议简述 TCP 提供面向有连接的通信传输,面向有连接是指在传送数据之前必须先建立连接,数据传送完成后要释放连接. 无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接.在TCP/I ...

  7. TCP三次握手和四次挥手过程

    1.三次握手 (1)三次握手的详述 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源.Client端接收到ACK报文后也向Server段发生ACK报文, ...

  8. 【源码+图片素材】Java王者荣耀游戏开发_开发Java游戏项目【王者荣耀】1天搞定!!!腾讯游戏_Java课程设计_Java实战项目_Java初级项目

    王者荣耀是当下热门手游之一,小伙伴们是否想过如何制作一款属于自己的王者荣耀游戏呢? 本课程讲解了一个王者荣耀游戏的详细编写流程,即使你是刚入门Java的新手,只要你简单掌握了该游戏所需要的JavaSE ...

  9. TCP原理和三次握手和四次挥手过程

    TCP原理和三次握手和四次挥手过程 TCP原理和三次握手和四次挥手过程 TCP是什么?有什么作用? 三次握手 连接建立 详细过程 四次挥手 连接终止 详细过程 参考 TCP原理和三次握手和四次挥手过程 ...

  10. 三次握手与四次挥手过程详解

    三次握手与四次挥手过程详解 三次握手建立连接: 传输数据过程: 四次握手断开连接: 常见面试问题: TCP通信过程包括三个步骤:建立TCP连接通道,传输数据,断开TCP连接通道 上图主要包括三部分:建 ...

最新文章

  1. 计算几何题中的英语生词
  2. 实现大规模图计算的算法思路
  3. jquery eaayui 学习(三)tab
  4. DJANGO用户名认证一例
  5. 第 1 节: 1-文本自增演示HttpHandler不记忆状态
  6. 利用gcc的__attribute__编译属性section子项构建初始化函数表【转】
  7. ajax请求后台报没有body_前端常见面试 - 请求篇
  8. HDU - 6333 Problem B. Harvest of Apples(莫队变形+思维+组合数学,好题)
  9. js 操作java对象_JavaScript 对象基础
  10. Struts2上传文件的大小设置
  11. PyCharm 通过Github和Git上管理代码
  12. html标记的索引,基于HTML标记分析及中文切词的网页索引研究与实现
  13. 将String数组转换到Double数组
  14. Android Gradle配置构建
  15. “广” “专”的抉择 -- 个人技术发展之我见!
  16. 弯管机编程软件电脑版_编程一点通电脑版
  17. Unity MasterServer主服务器
  18. 计算机网络基础肖盛文电子书,网络实用教程
  19. 升级版的冒泡排序Java
  20. 经典仿句100例_仿写句子_二年级仿写句子100例

热门文章

  1. pandas使用query函数查询指定日期索引之间对应的dataframe数据行(select rows date index between a certain date interval)
  2. R语言e1071包中的支持向量机:仿真数据(螺旋线性不可分数据集)、简单线性核的支持向量机SVM(模型在测试集上的表现、可视化模型预测的结果、添加超平面区域与原始数据标签进行对比分析)、如何改进核函数
  3. pandas判断日期是否是闰年(is_leap_year)实战: 数据列转化为日期(时间)格式、判断pandas的日期数据列是否是闰年
  4. 词袋模型(bag of words)构建并使用主题模型(topic models)特征进行文本聚类分析(clustering analysis)实战
  5. 生物信息学 生物科学、农学、林学、医学
  6. win10 c盘清理_win10 C盘爆红怎么清理?
  7. tensorflow GPU python cuda cudnn 匹配
  8. java普通项目打包成exe可执行文件
  9. 【建站系列教程】3、建站基本技术介绍
  10. 过拟合的原因以及解决办法(深度学习)