此博文是学习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中含有动态估算客户和server之间的往返时间(round-trip time RTT)的算法,知道等待确认须要多少时间。TCP中对所发送数据中的每个字节进行排序(序列号), 比如一个应用写2048字节到一个TCP套接字。导致TCP发送2个分节,一个分节发送序列号为1~1024的数据。一个分节发送序列号为1025~2048的数据, 接收端会对数据的序列号进行排序组合(各个分节可能非顺序到达目的端),保证数据的正确性。同一时候假设分节在传输的过程中丢失,发送端应该超时重传。对于反复的分节。接收端有能力丢弃反复的分节。TCP总是告知对端不论什么时刻它一次能从对端接收多少字节的数据,这称为通告窗体,该窗体指出接收缓冲区中当前可用的空间量,从而保证发送端发送的数据不会使接收缓冲区溢出。

    通过此种方式提供流量的控制。

  2. TCP连接的建立和终止

    通常server端通过调用socket,bind和listen实现“被动打开”, client通过调用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. TCPport号和并发server

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

    {接收接口的IP地址:服务port号。client的IP地址:client的port号}//服务端的4元素套接字对

    {client出口IP地址:client暂时port号,server的IP地址:服务port号}//client的4元素套接字对

    对于一个多宿主机监听21号port的套接字,假设不设置监听端接口的IP地址,则是通配符*表示。表示监听到达此主机的随意IP地址(server的IP地址)。在UNIX中能够通过SOADDR_ANY指定。在调用bind前把套接字的地址结构中的IP地址字段设置为 SOADDR_ANY;

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

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

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

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

    全部目的port号为21 的其它TCP分节都被递送到监听套接字的父进程。

  4. 缓存区大小和限制

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

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

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

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

  1. c++ 网络编程(一)TCP/UDP windows/linux 下入门级socket通信 客户端与服务端交互代码

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9601511.html c++ 网络编程(一)TCP/UDP  入门级客户端与服务端交互代码 网 ...

  2. Fixed-Length Frames 谈谈网络编程中应用层(基于TCP/UDP)的协议设计

    http://blog.sina.com.cn/s/blog_48d4cf2d0101859x.html 谈谈网络编程中应用层(基于TCP/UDP)的协议设计 (2013-04-27 19:11:00 ...

  3. Python之路(第三十篇) 网络编程:socket、tcp/ip协议

    一.客户端/服务器架构 1.硬件C/S架构(打印机) 打印机作为一个服务端,电脑连接打印机进行打印 2.软件C/S架构 互联网中处处是C/S架构 如谷歌网站是服务端,你的浏览器是客户端(B/S架构也是 ...

  4. 网络编程(四)--基于udp协议的套接字、socketserver模块

    一.UDP协议(数据报协议) 1.何为udp协议 不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包. 以太网头 ip头                  ...

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

    基于udp协议的套接字.socketserver模块 一.UDP协议(数据报协议) 1.何为udp协议 不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包. ...

  6. UNIX网络编程---传输层:TCP、UDP、SCTP(二)

    UNIX网络编程----传输层:TCP.UDP.SCTP 一.概述 本章的焦点是传输层:包括TCP.UDP.和SCTP(流控制传输协议).SCTP是一个较新的协议,最初设计用于跨因特网传输电话信令. ...

  7. 找呀志_java网络编程(4)TCP/IP、Http和Socket差额

    经java网络编程(1)网络体系结构及通信协议我知道IP协议相应于网络层.TCP协议相应于传输层.而HTTP协议相应于应用层, 三者从本质上来说没有可比性 TPC/IP协议是传输层协议,主要解决数据怎 ...

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

    网络基础概览 socket概览 socket模块—TCP/UDP的实现 TCP/UDP总结 网络基础概览 osi七层协议各层主要的协议 # 物理层传输电信号1010101010 # 数据链路层,以太网 ...

  9. [转帖]关于网络编程中MTU、TCP、UDP优化配置的一些总结

    关于网络编程中MTU.TCP.UDP优化配置的一些总结 https://www.cnblogs.com/maowang1991/archive/2013/04/15/3022955.html 感谢原作 ...

随机推荐

  1. POJ 3855 计算几何·多边形重心

    思路: 多边形面积->任选一个点,把多边形拆成三角,叉积一下 三角形重心->(x1+x2+x3)/3,(y1+y2+y3)/3 多边形重心公式题目中有,套一下就好了 计算多边形重心方法: ...

  2. Coursera公开课-Machine_learing:编程作业8(2016-10-06 20:49)

    Anomaly Detection and Recommender Systems 本周编程作业分为两部分:异常检测和推荐系统. 异常检测:本质就是使用样本的到特种值的gaussian分布,来预估正确 ...

  3. TCP协议滑动窗口(一)——控制大批量数据传输速率

    窗口大小:TCP头中一个16位的域,表示当前可用接受缓冲区大小.在每个TCP对等段连接初始化时,告诉对方自己的窗口大小(不一定是满额,假如满额65201字节,可能暂时通告5840字节).若客户端接受数 ...

  4. enc28j60网卡驱动模块添加进linux内核,Kconfig,Makefile配置过程

    这里是要把http://www.cnblogs.com/hackfun/p/6260396.html中的enc28j60网卡驱动模块,添加到2.6.22.6内核中,这个模块代码不需要任何修改.只需要在 ...

  5. python认识标识符

    #python标识符 Python在编程的时候,起的名字就叫做标识符,其中变量和常量就是标识符的一种 #命名原则 在python中标识符的命名是有规则的,按正确命名规则命名的可以使用的标示符叫做有效标 ...

  6. Java笔记整理列表

    整理Java相关知识点. 2018-11-20 1:Java入门学习 2:Java进阶

  7. SSL&TLS传输层加密协议实现图解--(重要)

    一.SSL&TLS 1.SSL:Secure Sockets Layer ,加密套接字协议层 1)SSL是为网络通信提供安全及数据完整性的一种安全协议,在传输层对网络连接进行加密 Secure ...

  8. C# textbox 获得焦点

    this.ActiveControl = txt_core;

  9. Review:Microbiota, metagenome, microbiome傻傻分不清

    Microbiota 微生物群   微生物群是指研究动植物体上共生或病理的微生物生态群体.微生物群包括细菌.古菌.原生动物.真菌和病毒.研究表明其在宿主的免疫.代谢和激素等方面非常重要.近义词Micr ...

  10. CAD在网页中返回当前图纸的最小外包矩形框

    主要用到函数说明: _DMxDrawX::GetMcDbDatabaseBound 返回当前图纸的最小外包矩形框,详细说明如下: 参数 说明 DOUBLE* pLbx 返回最小外包矩形框左下角X值 D ...