UNP(一):网络编程角度下的TCP、UDP协议

此博文是学习UNP(UNIX Network Programming)后的读书笔记,供以后自己翻阅回顾知识。

  1. TCP、UDP概述

    在前面《计算机网络与TCP/IP》栏目下已经介绍过一些关于TCP、UDP的相关知识TCP/IP(三):传输层TCP与UDP,这里只是简单从UNIX网络编程的角度介绍TCP、UDP协议。

    我们都知道UDP 缺乏可靠性无连接的面向数据报 的协议,如果想确保数据报到达目的地,必须自己在应用层实现一些特性:对端的确定、本端的超时和重传等。UDP面向报文的特性,使得UDP不像TCP中可以通过设置MSS(最大分节大小)避免IP层分片,UDP中没有相应的措施避免在IP层中进行分片,所以在使用UDP中,应该控制传输数据报的大小,避免分片,但是数据报太小,利用率低,应该合理规划。

    相反,TCP提供 可靠的传输服务、流量控制、面向字节流、连接的协议, 通过超时重传、确认等手段实现可靠的传输服务,TCP中含有动态估算客户和服务器之间的往返时间(round-trip time RTT)的算法,知道等待确认需要多少时间。TCP中对所发送数据中的每个字节进行排序(序列号), 例如一个应用写2048字节到一个TCP套接字,导致TCP发送2个分节,一个分节发送序列号为1~1024的数据,一个分节发送序列号为1025~2048的数据, 接收端会对数据的序列号进行排序组合(各个分节可能非顺序到达目的端),保证数据的正确性,同时如果分节在传输的过程中丢失,发送端应该超时重传,对于重复的分节,接收端有能力丢弃重复的分节。TCP总是告知对端任何时刻它一次能从对端接收多少字节的数据,这称为通告窗口,该窗口指出接收缓冲区中当前可用的空间量,从而保证发送端发送的数据不会使接收缓冲区溢出。通过此种方式提供流量的控制。

  2. TCP连接的建立和终止

    通常服务器端通过调用socket,bind和listen实现“被动打开”, 客户端通过调用socket,connect实现“主动打开”,TCP通过三次握手建立连接

    终止一个TCP连接需要4个分节:

    • 主动调用close的应用进程执行“主动关闭”,此时改端发送一个FIN分节,表示数据发送完毕;
    • 接收这个FIN的对端执行被动关闭。此时这个FIN内核TCP负责进行确认,用户程序不用管是内核在主动进行回答同时内核将一个文件结束符(end-of-file)传递给接收端的应用程序(放在等候应用程序接收的任何其他数据之后),FIN的接收意味着接收应用进程在相应的连接上没有数据可以接收。
    • 一段时间后,当应用程序接收到这个文件结束符,应用程序调用close主动关闭它的套接字,这导致它的TCP也发送一个FIN
    • 接收这个最终FIN的原发送端TCP(执行主动关闭的那一端)确认这个FIN,对FIN的确认都是内核TCP协议在进行处理。

    TCP的11个状态转换图:

    TCP的同时打开和同时关闭:

    TIME_WAIT状态两个存在理由:(详细见

    • 可靠地实现TCP全双工连接的终止;
    • 允许老的重复分节在网络中的消逝。
  3. TCP端口号和并发服务器

    TCP无法仅仅通过查看目的端口号来分离外来的分节到不同的端点,必须查看套接字对的所有4个元素才能确定由哪个端点来接收某个到达的分节。

    {接收接口的IP地址:服务端口号,客户端的IP地址:客户端的端口号}//服务端的4元素套接字对

    {客户端出口IP地址:客户端临时端口号,服务器的IP地址:服务端口号}//客户端的4元素套接字对

    对于一个多宿主机监听21号端口的套接字,如果不设置监听端接口的IP地址,则是通配符*表示,表示监听到达此主机的任意IP地址(服务器的IP地址),在UNIX中可以通过SOADDR_ANY指定,在调用bind前把套接字的地址结构中的IP地址字段设置为 SOADDR_ANY;

    当客户主机启动一个客户执行主动打开,指定服务器的IP地址为12.106.32.254,服务器端的通过调用fork生成子进程进行处理,此时服务端有两个套接字,一个是监听套接字,一个是和客户连接的套接字:

    当有多个客户请求的时候,套接字对的情况如下:

    如果一个分节来自206.168.112.219:1500,目的地址为:12.106.32.254:21,它被传递给第一个进程进行处理;

    如果一个分节来自206.168.112.219:1501,目的地址为:12.106.32.254:21,它被传递给第二个进程进行处理;

    所有目的端口号为21 的其他TCP分节都被递送到监听套接字的父进程。

  4. 缓存区大小和限制

    每一个TCP套接字都有一个发送缓存区,可以通过SO_SNDBUF套接字选项来更改缓存区的大小,当某个进程中调用write时,内核从该应用进程的缓存区中复制所有数据到所写套接字的发送缓存区中,如果缓存区的容不下应用进程的所有数据(发送缓存区的数据大小太小或者发送缓存区存在数据),此时write会阻塞,直到发送缓存区中有空间存应用进程发送的数据。当应用进程从write返回只是说明可以重新使用原来的应用进程的缓存区,不代表对端接收到数据。

    这里的输出队列需要注意的是,如果输出队列满了,新到的分组将会丢弃,同时沿协议栈向上返回一个错误,在某个时刻重传这个分节。套接字缓存区中的数据,直到接收到对端的确认,才会删除数据。

    对于UDP来说,内核并没有维护一个套接字发送缓存区,但是依然可以通过SO_SNDBUF设置发送缓存区的大小,如果应用程序写一个大于缓存区大小的数据报将返回EMSGSIZE错误。而实际不存在套接字缓存区,因为UDP中不需要处理超时重传,同理,write返回成功不能说明对端接收到数据,只能说明所写的数据报加入到数据链路层的输出队列,同时如果队列已满,则丢弃数据报,内核可能返回错误也可能不返回错误,具体依赖于实现。

时间: 2024-10-11 13:46:01

UNP(一):网络编程角度下的TCP、UDP协议的相关文章

网络编程(四)——基于udp协议的套接字socket、socketserver模块的使用

基于udp协议的套接字.socketserver模块 一.UDP协议(数据报协议) 1.何为udp协议 不可靠传输,"报头"部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包. 以太网头 ip头                      udp头                            数据                                            tcp协议(流式协议) 2.udp协议的特点 (1)传输数据以数据报的形

关于网络编程中MTU、TCP、UDP、IP

名词解释: MTU(Maxium Transmission Unit)最大传输单元 TCP (Transmission Control Protocal)传输控制协议 UDP (Usage Datagram Protocal)用户数据报协议 IP (Internet Protocal) 因特网协议 TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层(TCP/IP是一个协议簇,并不是代表TCP协议和IP协议) 以太网(Ethemet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传

网络编程释疑之:TCP连接拔掉网线后会发生什么

背景:前些天团队在进行终端设备和服务器端长连接业务的测试时,发现了这么一个情况:在拔掉设备端的网线后,再插上网线,有时可以继续正常的进行长接连请求,而且用的还是拔掉网线之前的那个长连接.但是有时却不能继续正常的长连接请求,需要重新建立一个新的长连接.让我尤感诧异的是第一种网线断开再插上后长连接可以恢复的情况,彻底颠覆了我一直抱有的一个所谓的"物理连接"的观念.究竟怎么回事,我们来探个究竟. 首先说说我自己发明的"物理连接"这个名词,不管怎么说我都是一个网络编程的&q

赵雅智_java网络编程(4)TCP/IP、Http和Socket的区别

通过java网络编程(1)网络体系结构及通信协议我知道IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用层, 三者从本质上来说没有可比性 TPC/IP协议是传输层协议,主要解决数据如何在网络中传输, 而HTTP是应用层协议,主要解决如何包装数据. socket是对TCP/IP协议的封装和应用(程序员层面上). 三者关系 总的来说 传输层的TCP是基于网络层的IP协议的 应用层的HTTP协议又是基于传输层的TCP协议的 Socket本身不算是协议,它只是提供了一个针对TCP或者

网络编程—网络基础概览、socket,TCP/UDP协议

网络基础概览 socket概览 socket模块-TCP/UDP的实现 TCP/UDP总结 网络基础概览 osi七层协议各层主要的协议 # 物理层传输电信号1010101010 # 数据链路层,以太网协议,arp协议.对这些信号进行分组,同时规范了分组形式--以太网协议,头部是mac地址中间是信息, # 网络层:ip协议,arp协议帮忙找到mac地址,ip,子网掩码,网关(下面有一些简单概括) # 传输层:tcp协议,udp协议 # (socket)就是一组接口,将复杂的tcp协议和udp协议隐

【TCP/IP网络编程】:06基于UDP的服务器端/客户端

本篇文章简单描述了UDP传输协议的工作原理及特点. 理解UDP UDP和TCP一样同属于TCP/IP协议栈的第二层,即传输层. UDP套接字的特点 UDP的工作方式类似于传统的信件邮寄过程.寄信前应先在信封上填好寄信人和收信人的地址,之后贴上邮票放进邮筒即可.当然信件邮寄过程可能会发生丢失,我们也无法随时知晓对方是否已收到信件.也就是说信件是一种不可靠的传输方式,同样的,UDP所提供的也是一种不可靠的数据传输方式(以信件类比UDP只是通信形式上一致性,之前也以电话通信的方式类比了TCP的通信方式

python 网络编程 (二)---tcp

异常 python的socket模块实际上定义了4种可能出现的异常: 1)与一般I/O 和通信问题有关的socket.error; 2)与查询地址信息有关的socket.gaierror; 3)与其他地址错误有关的socket.herror; 4)与在一个socket上调用settimeout()后,处理超时有关的socket.timeout; import socket, sys, time host = sys.argv[1] textport = sys.argv[2] filename

【Java】Java网络编程菜鸟进阶:TCP和套接字入门

Java网络编程菜鸟进阶:TCP和套接字入门 JDK 提供了对 TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Datagram Protocol,用户数据报协议)这两个数据传输协议的支持.本文开始探讨 TCP. TCP 基础知识 在“服务器-客户端”这种架构中,服务器和客户端各自维护一个端点,两个端点需要通过网络进行数据交换.TCP 为这种需求提供了一种可靠的流式连接,流式的意思是传出和收到的数据都是连续的字节,没有对数据量进行大小限制.

嵌入式 Linux网络编程(二)——TCP编程模型

嵌入式 Linux网络编程(二)--TCP编程模型 一.TCP编程模型 TCP编程的一般模型如下图: TCP编程模型分为客户端和服务器端编程,两者编程流程如下: TCP服务器端编程流程: A.创建套接字: B.绑定套接字: C.设置套接字为监听模式,进入被动接受连接状态: D.接受请求,建立连接: E.读写数据: F.终止连接. TCP客户端编程流程: A.创建套接字: B.与远程服务器建立连接: C.读写数据: D.终止连接. 二.TCP迭代服务器编程模型 TCP循环服务器接受一个客户端的连接