`

网络编程-TCP笔记

阅读更多

    很久没写博客了,最近也看了不少书,看完了好像印象不深,还是回头写写记录下吧。。

 

1.TCP机制
    TCP提供了可靠性 ,当TCP向另外一端发送数据时,它要求对端返回一个确认。如果没有收到确认,TCP就自动重传数据并等待更长的时间。在数次重传失败后,TCP才放弃,如此在尝试发送数据上所花的总时间一般为4-8分钟(依赖具体实现)。
    TCP含有用于动态估算客户和服务器之间的往返时间(round-trip time,RTT)的算法 ,以便它知道等待一个确认需要多少时间。
    TCP通过给其中每个字节关联一个序列号对所发送的数据进行排序。 接受端TCP将先根据它们的序列号重新排序,再把结果数据传递给应用。如果收到重复的数据(根据序列号),将丢弃该数据。
    TCP提供流量控制。 TCO总是告知对端在任何时刻它一次能够从对端接受多少字节的数据,这称为通知窗口(advertised window)。在任何时刻,该窗口指出接受缓冲区中当前可用的空间量,从而确保发送端发送的数据不会使接受缓冲区溢出。该窗口时刻动态变化,当接收来自发送端的数据时,窗口大小就减小,但是当接受端应用从缓冲区中读取数据是,窗口大小就增大。通知窗口大小减小到0是有可能的,当TCP对应某个套接字的接受缓冲区已满,导致它必须等待应用从该缓冲区读取时间时,方能从对端再接受数据。

2.TCP连接的建立和终止
    TCP连接的建立的三路握手
 

 
    (1)通常通过调用socket/bind和listen这三个函数来完成,我们称之为被动打开(passive open)。
    (2)客户通过调用connect发动主动打开(active open)。这导致客户TCP发送一个SYN(同步)分节,它告诉服务器客户将在(待建立的)连接中发送的数据的初始化序列号。通常SYN分节不携带数据,其所在IP数据报只含有一个IP首部/一个TCP首部及可能有的TCP选项。
    (3)服务器必须确认(ACK)客户的SYN,同时自己也得发送一个SYN分节,它含有服务器将在同一连接中发送的数据和初始化序列号。服务器在单个分节中发送SYN和对客户SYN的ACK(确认)。
    (4)客户必须确认服务器的SYN。
这种交换至少需要3个分组,因此称之为三路握手。

    TCP连接的终止



 
 
 
    TCP连接的终止每个方向都需要一个FIN和ACK,通常需要4个分节,中间两个分节也有可能合并成一个分节。而原理和建立发的包的原理差不多,看图就能明白。

3.TCP状态转换图
    这些状态都可以使用netstat显示。
 



 


 
 
 

    从上图可以看出,值得注意的是,如果该连接的整个目的仅仅是发送一个单分节的请求和接收一个单分节的应答的请求和接受一个单分节的应答,那么使用TCP有8个分节的开销,如果改用UDP,那么只需交换两组:一个承接请求,一个承接应答,当然这也丧失了TCP的可靠性等特性。
    TIME_WAIT状态
    TCP中有关网络编程中TIME_WAIT状态不容易理解。该端点停留在这个状态的持续时间是最常分节生命期(maximum segment lifetime,MSL)的两倍。TIME_WAIT状态有两个存在的理由:(1)可靠地势险TCP全双工连接的终止。该理由容易理解,主要是为了发送最终的ACK(2)允许老的重复分节在网络中消逝。该理由是说TCP必须防止来自某个连接的老的重复分组在该连接已终止后再先,从而被误解成属于同一连接的某个新的化身。

4.TCP三路握手

TCP中调用connect函数将激发三路握手,其中建立连接出现的错误可能有以下几种:

   (1)若TCP客户没有收到SYN分节的响应,则返回ETIMEOUT错误。
   (2)若对客户的SYN的响应是RST(复位),则表明该服务器主机在我们指定的端口没有进程在等待与之连接(例如服务器进程也许没在运行)。这是一种硬错误,客户一接收到RST就马上返回ECONNREFUSD错误。RST是TCP在发生错误时发送的一种TCP分节。产生RST的条件之:目的地为某个端口的SYN到达,然而该端口上没有正在监听的服务器;TCP想取消一个已有连接;TCP接受到一个根本不存在的连接上的分节。
   (3)若客户发生的SYN在中间的某个路由器上引发了一个“destination unreachable”ICMP错哦无,则认为是一个软错误。客户端保存该消息,并按照第一种情况中所述的时间间隔继续发送SYN。若在某个规定的时间(BSD规定75s)后仍未收到响应,则把保存的消息作为EHOSTUNREACH 或ENETUNRACH错误返回给进程。

5.服务器异常情况
    当服务器端被kill掉,将导致想客户端发送一个FIN,然而如果客户端在正在阻塞在可读或者可写状态时,客户端不作反应,知道下次读或写数据时,才响应该错误。这种情况可用其他方法解决,例如select函数或者设置SO_KEEPALIVE时间。

 

----以下是摘录网上的TCP错误原因---

第1个异常是java.net.BindException:Address already in use: JVM_Bind。该异常发生在服务器端进行new ServerSocket(port)(port是一个0,65536的整型值)操作时。异常的原因是以为与port一样的一个端口已经被启动,并进行监听。此时用netstat –an命令,可以看到一个Listending状态的端口。只需要找一个没有被占用的端口就能解决这个问题。 

第2个异常是java.net.ConnectException: Connection refused: connect。该异常发生在客户端进行new Socket(ip, port)操作时,该异常发生的原因是或者具有ip地址的机器不能找到(也就是说从当前机器不存在到指定ip路由),或者是该ip存在,但找不到指定的端口进行监听。出现该问题,首先检查客户端的ip和port是否写错了,如果正确则从客户端ping一下服务器看是否能ping通,如果能ping通(服务服务器端把ping禁掉则需要另外的办法),则看在服务器端的监听指定端口的程序是否启动,这个肯定能解决这个问题。 

第3个异常是java.net.SocketException: Socket is closed,该异常在客户端和服务器均可能发生。异常的原因是己方主动关闭了连接后(调用了Socket的close方法)再对网络连接进行读写操作。 

第4个异常是java.net.SocketException: (Connection reset或者Connect reset by peer:Socket write error)。该异常在客户端和服务器端均有可能发生,引起该异常的原因有两个,第一个就是如果一端的Socket被关闭(或主动关闭或者因为异常退出而引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer)。另一个是一端退出,但退出时并未关闭该连接,另一端如果在从连接中读数据则抛出该异常(Connection reset)。简单的说就是在连接断开后的读和写操作引起的。 

第5个异常是java.net.SocketException: Broken pipe。该异常在客户端和服务器均有可能发生。在第4个异常的第一种情况中(也就是抛出SocketExcepton:Connect reset by peer:Socket write error后),如果再继续写数据则抛出该异常。前两个异常的解决方法是首先确保程序退出前关闭所有的网络连接,其次是要检测对方的关闭连接操作,发现对方关闭连接后自己也要关闭该连接。

  • 大小: 44.7 KB
  • 大小: 44.5 KB
  • 大小: 94.6 KB
  • 大小: 24.6 KB
分享到:
评论

相关推荐

    商业编程-源码-TCP IP学习笔记补遗.zip

    这份"商业编程-源码-TCP IP学习笔记补遗.zip"压缩包文件,显然是为那些希望深入理解TCP/IP协议并将其应用于实际商业编程的人准备的。在深入探讨相关知识点之前,我们先了解TCP/IP模型的四个主要层次:应用层、传输层...

    黑马_Linux网络编程-网络基础-socket编程-高并发服务器

    ### 黑马_Linux网络编程-网络基础-socket编程-高并发服务器 #### 知识点概述 本篇文章旨在深入解读“黑马_Linux网络编程-网络基础-socket编程-高并发服务器”相关的核心概念和技术要点,包括网络基础知识、常用...

    【Socket编程】--TCP异步通讯一服务器多客户端

    在IT行业中,网络编程是必不可少的一部分,特别是在分布式系统和互联网应用中。Socket编程是网络通信的基础,它提供了进程间通信(IPC)的能力,允许不同计算机上的应用程序通过网络进行数据交换。本篇将深入探讨"...

    网络编程-狂神说Java学习笔记

    "狂神说Java学习笔记"提供了深入理解和实践网络编程的宝贵资源。本笔记主要涵盖了以下几个关键知识点: 1. **Java网络编程基础**:Java通过Socket API提供了网络通信的能力。Socket代表了网络上的两个应用程序之间...

    Qt网络编程基础-思维导图-学习笔记

    Qt网络编程的基础知识,涵盖了TCP/IP客户端和服务器的实现,以及如何获取本机网络信息。Qt网络模块提供了编写TCP/IP客户端和服务器的类,如QTcpSocket用于实现TCP客户端功能,QTcpServer用于实现TCP服务器功能,以及...

    【Linux网络编程笔记】TCP短连接产生大量TIME_WAIT导致无法对外建立新TCP连接的原因及解决方法—实践篇 - slv

    【Linux网络编程笔记】TCP短连接产生大量TIME_WAIT导致无法对外建立新TCP连接的原因及解决方法,这是一个关于网络编程和Linux系统配置的问题。在TCP/IP通信中,TIME_WAIT状态是TCP连接生命周期的一部分,用于确保...

    【网络编程】-笔记.docx

    主要探讨的是计算机间通过网络进行通信的技术,涉及软件架构的两种主要类型——CS(Client/Server)和BS(Browser/Server)结构,以及网络通信的基础知识,包括TCP/IP协议、TCP和UDP协议,以及网络编程的三个关键...

    VC学习笔记-基于TCP的socket编程

    在VC(Visual C++)环境下进行网络编程时,基于TCP的socket编程是实现客户端与服务器之间通信的重要方式之一。本文将从初始化、创建socket、绑定地址、监听连接、接受连接、数据传输以及关闭socket等步骤,详细介绍...

    TCP-IP.rar - TCP/IP学习笔记

    这份"TCP/IP学习笔记"涵盖了TCP/IP协议族的关键组成部分,包括分层模型、IP地址、TCP与UDP协议、DNS解析、网络传输以及相关的应用层协议等内容。 一、TCP/IP分层模型 TCP/IP模型分为四层,分别是应用层、传输层、...

    Linux网络编程全接笔记

    ### Linux网络编程全接触笔记详解 #### 一、分层模型结构 1. **OSI 7层模型**:这是国际标准化组织(ISO)提出的一个网络分层模型,旨在为不同厂商之间的网络设备提供标准接口。它从下往上依次分为: - **物理层*...

    day11【网络编程】-笔记1

    "网络编程入门" ...在网络编程中,能够辨别UDP和TCP协议特点,能够说出TCP协议下两个常用类名称,能够编写TCP协议下字符串数据传输程序,能够理解TCP协议下文件上传案例,能够理解TCP协议下案例2等。

    java网络编程笔记

    #### 标题解析:Java网络编程笔记 在当今数字化时代,网络编程已成为软件开发中不可或缺的一部分,尤其在J2EE(Java 2 Platform, Enterprise Edition)框架下,其重要性更为凸显。J2EE为构建企业级应用提供了强大的...

    Linux网络编程超级详细笔记

    ### Linux网络编程超级详细笔记 #### 一、Linux网络基础知识 ##### 1.1 客户端程序和服务端程序 在网络编程中,程序通常被划分为两大部分:**客户端**和**服务端**。这种划分使得不同的计算机或设备能够相互通信...

    《Visual C 网络编程》读书笔记模板.pptx

    《Visual C# 网络编程》读书笔记模板 Visual C# 网络编程是指使用 C# 语言进行网络编程的技术,涵盖了网络协议、 socket 编程、 Internet 应用编程等多个方面。下面是《Visual C# 网络编程》读书笔记模板中的知识点...

    Socket网络编程学习笔记.zip

    **网络编程基础** 在计算机科学中,网络编程是构建和维护多台...无论是TCP的可靠连接还是UDP的快速传输,掌握Socket编程都是网络开发者的必备技能。通过深入学习,你可以构建起自己的网络应用,实现跨网络的通信。

    unix网络编程读书笔记

    UNIX 网络编程读书笔记内容涵盖了 UNIX 网络编程的基本概念、Socket 编程、TCP/IP 协议、网络服务器设计思想、并发服务器设计等多个方面。整体来说,这篇读书笔记对 UNIX 网络编程的知识点进行了系统的总结和概括。 ...

    Socket网络编程学习笔记

    Socket网络编程是计算机网络通信的核心技术之一,它允许两台或多台计算机通过互联网进行数据交换。在本学习笔记中,我们将深入探讨...希望这个学习笔记能为你提供有价值的参考,助你在Socket网络编程的道路上更进一步。

    net-lenrning-reference__TCP/IP网络编程笔记

    TCP/IP网络编程笔记

    Matlab-tcp-udp-ip-2.0.6工具箱中文手册.pdf

    tcp_udp_ip 工具箱是 Matlab 的一个扩展工具箱,提供了 TCP/IP、UDP/IP 协议的实现,使得用户可以在 Matlab 环境中进行网络编程和数据传输。 Tcp/UDP/IP 协议是计算机网络中最基本的通信协议,分别代表传输控制协议...

Global site tag (gtag.js) - Google Analytics