好久不读不用又忘得差不多了,还是感叹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. ElasticSearch学习笔记(三)logstash安装和logstash-input-jdbc插件

    ElasticSearch的索引可以手动添加索引的,就是类似下面这样添加的 PUT /movies/movie/1 { "title": "The Godfather&q ...

  2. ckeditor4.5.11+ckfinder_java2.6.2配置

    http://blog.csdn.net/skyman1942/article/details/52537100 1.环境说明: 日期:2016-09-14 工具:ckeditor_4.5.11+ck ...

  3. 浅谈javascript和python语言的深拷贝

    深拷贝: 之前在开发中我遇到一个很大的bug,经过我多次调试之后我发现原本应该有保存数据的地方数据全部被清空,仔细一看发现原来是被人为删除,明明操作的是一个副本,为什么原本也会跟着一起被删除呢?经过了 ...

  4. 【Alpha】Phylab 测试报告

    PhyLab Alpha 测试报告 测试中发现的bug Bug 可能原因 实验区域发布评论,如果需要验证码,无法填写 评论频率过快,实验区未接入验证码系统 忘记密码,但无邮件发送 忘记密码部分暂未修复 ...

  5. windows 虚拟机VMware 安装linux系统注意事项!!!

    1.主机CPU是否支持虚拟化技术?      启动 CPUZ 软件(如下图) 注: 32位系统查看使用CPUZ_x86软件             64位系统查看使用CPUZ_x64软件    启动后 ...

  6. hiho# 1394最小路径覆盖 网络流拆点

    题目传送门 思路: 观察到路径上除了终点起点以外的每个点出度和入度都为1,和网络流的拆点很像,所以就把每个点都拆成两个点,若存在一条路径$(u,v)$,则建一条$(u,v+n,1)$的边,然后求出最大 ...

  7. Android开发不可或缺的十大网站及工具

    1. Google 做开发前完全是小白,真心不知道有Google这东西,只晓得百度,遇到问题直接百度,不是黑百度,百度在娱乐八卦方面确实靠谱,但是技术方面查出来的东西基本千篇一律,有些答案甚至还会起到 ...

  8. 异常捕获设置HTTPStatus

    第一步:创建一个异常类 package com.payease.exception; /** * @Created By liuxiaoming * @CreateTime 2017/12/12 下午 ...

  9. 关于语法节点Tree、类型Type和符号Symbol

    每个语法节点Tree都有Type属性,部分的语法节点有Symbol属性,如下: 与Symbol类型与Type类型之间的关系如下: 下面是Symbol与Type之间的关系: (1)MethodSymbo ...

  10. vue下拉搜索

    vue版本是1.0.21 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...