好久不读不用又忘得差不多了,还是感叹Richard Stevens真是太刁,25年前第一版。

"Tcp state diagram fixed new" by Scil100. Licensed under CC BY-SA 3.0 via Wikimedia Commons - http://commons.wikimedia.org/wiki/File:Tcp_state_diagram_fixed_new.svg#/media/File:Tcp_state_diagram_fixed_new.svg

TCP连接建立:

TCP连接断开:

TIME_WAIT:

为MSL(maximum segment lifetime)的两倍,(a)可靠的实现TCP全双工连接的终止。如果最后一个ACK在路上丢了,那么被动关闭端又会再发一次FIN,并期望得到一个ACK。如果没有TIME_WAIT这个等待时间的话,主动关闭端在收到重发的FIN前就关闭了自己的socket,那么对方重发FIN后会得到一个RST。这样一来关闭工作就只进行了一半(单方面的),而没有双向进行。(b)由于TIME_WAIT的时间是MSL的两倍,使得某个方向上的分组最多存活MSL秒就被丢弃,另一方向上的应答最多存活MSL也被丢弃。这样当相同的四元组再建立连接时,其数据包不会和以前的那次连接混合起来。在TIME_WAIT时间范围TCP也必须防止建立与该连接相同的四元组连接。

TCP输出(write返回的含义):

当使用阻塞的write进行TCP数据发送时,如果所要写入的数据比套接字发送缓冲区中空余空间多,则进程将被投入睡眠。当用户数据全部被复制到发送缓冲区后,write返回。因而TCP套接字使用write返回并不代表着数据已经发送或者已经到达对方,而只是说明数据已经全部被复制到套接字发送缓冲区中了。可以使用SO_SNDBUF来更改套接字缓冲发送缓冲区大小。发送缓冲区的数据进过TCP,IP等协议封装到达数据链路层的发送队列,如果此时队列已满,则逐层向上传递错误,TCP将在以后某个时刻重传相应的分节。本端TCP必须在得到对端的数据接收ACK信息后才能把自己的曾经发送的数据清除。

UDP输出(write返回的含义):

UDP也可以通过SO_SNDBUF指定一个大小,但该值只是规定UDP报文的大小上限。UDP并没有如TCP那样的真实发送缓冲区,在报文发送后数据就被链路层丢弃了。从一个UDP的write返回意味着所写的数据报或其所有片段已经被加入链路层的输出队列。

UNIX 网络编程笔记-CH2:TCP、UDP概貌的更多相关文章

  1. UNIX 网络编程笔记-CH3:套接字编程简介

    IPv4套接字地址结构 struct in_addr { in_addr_t s_addr; }; struct sockaddr_in { uint8_t sin_len; /* length of ...

  2. unix网络编程笔记(二)

    第四章笔记 1. 基本Tcpclient/server程序的套接字函数 2. socket函数: int socket(int family,int type,int protocol); (1)so ...

  3. 【深入浅出Linux网络编程】 “实践 -- TCP & UDP”

    通过上一篇博客的学习,你应该对基于epoll的事件触发机制有所掌握,并且通过阅读sio.c/sio.h应该也学会了如何封装epoll以及如何通过设计令epoll更加实用(用户回调,用户参数). 简单回 ...

  4. 【Unix网络编程】chapter8基本UDP套接字编程

    chapter8基本UDP套接字编程 8.1 概述 典型的UDP客户端/服务端的函数调用 8.2 recvfrom和sendto函数 #include <sys/socket.h> ssi ...

  5. Java基础知识强化之网络编程笔记04:UDP之发送端的数据来自于键盘录入案例

    1. 数据来自于键盘录入 键盘录入数据要自己控制录入结束. 2. 代码实现: (1)发送端: package com.himi.updDemo1; import java.io.IOException ...

  6. Java基础知识强化之网络编程笔记03:UDP之UDP协议发送数据 和 接收数据

    1. UDP协议发送数据 和 接收数据 UDP协议发送数据: • 创建发送端的Socket对象 • 创建数据,并把数据打包 • 调用Socket对象的发送方法,发送数据包 • 释放资源  UDP协议接 ...

  7. unix网络编程笔记

    TCP连接状态转换图:

  8. 【Unix网络编程】 chapter5 TCP客户,服务器程序实例

    chapter5 5.1 概述 5.2 TCP回射服务器程序:main函数 int main(int argc, char **argv) { int listenfd,connfd; pid_t c ...

  9. Java基础知识强化之网络编程笔记05:UDP之多线程实现聊天室案例

    1. 通过多线程改进刚才的聊天程序,这样我就可以实现在一个窗口发送和接收数据了 2.  代码示例: (1)SendThread.java,如下: package com.himi.udpDemo2; ...

随机推荐

  1. [iOS笔试600题]二、常识篇(共有72题)

    [B]1.NSObject是一个根类,几乎所有的类都是从它派生而来.但是根类并不拥有真它类都有的alloc和init方法?[判断题] A. 正确 B. 错误 [A]2. UIResponder可以让继 ...

  2. 【vim】简介与基本配置

    vim是一款非常强大的文字编辑软件,是各种类UNIX系统标配的文本编辑工具.相信此文的读者对它应该不会陌生,在这里就不做介绍了. 1.为什么要使用vim 在认识vim之前,我用过好多IDE:Visua ...

  3. [Linux] 如何在 Linux 中提取随机数

    如何在 Linux 中提取随机数 一.设备文件 /dev/random & /dev/urandom 字符特殊文件 /dev/random 和 /dev/urandom (存在于Linux 1 ...

  4. Java常见错误及解决方案

    1.类定义未找到:java.lang.NoClassDefFoundError java类文件没有上传:上传了,服务器没找到,建议将JSP页面重新更新或重启服务器. 2.

  5. numpy 模块常用方法

    Numpy是科学计算库,是一个强大的N维数组对象ndarray,是广播功能函数.其整合C/C++.fortran代码的工具 ,更是Scipy.Pandas等的基础 .ndim :维度 .shape : ...

  6. [转]iOS:批量导入图片和视频到模拟器的相册

    IOS开发中我们经常会用到模拟器调试,模拟器有个主要的好处就是程序启动块,最重要的是如果没有证书的话,我们就只能在模拟器上调试了.使用模拟器调试时我们可能碰到需要从系统相册选择图片的情况,特别是做图片 ...

  7. [原创]Laravel 的缓存源码解析

    目录 前言 使用 源码 Cache Facade CacheManager Repository Store 前言 Laravel 支持多种缓存系统, 并提供了统一的api接口. (Laravel 5 ...

  8. 可以修改类不用重启Tomcat加载整个项目

    修改类不重启Tomcat(不用手动重启) 修改tomcat  conf目录下的server.xml <Context path="/struts2" docBase=&quo ...

  9. 自定义ASP.NET Core日志中间件

    这个日志框架使用的是ASP.NET Core的NLog,用来记录每次请求信息和返回信息. 1.首先创建一个Web应用项目,我选择的是MVC模板: 2.使用NuGet添加Microsoft.Extens ...

  10. vue-cli3 chainWebpack配置,去除打包后文件的预加载prefetch/preload(已解决)

    //细节配置修改 chainWebpack: config => { console.log(config,'chainWebpack') // 移除 prefetch 插件 config.pl ...