UNIX 网络编程笔记-CH2:TCP、UDP概貌
好久不读不用又忘得差不多了,还是感叹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概貌的更多相关文章
- UNIX 网络编程笔记-CH3:套接字编程简介
IPv4套接字地址结构 struct in_addr { in_addr_t s_addr; }; struct sockaddr_in { uint8_t sin_len; /* length of ...
- unix网络编程笔记(二)
第四章笔记 1. 基本Tcpclient/server程序的套接字函数 2. socket函数: int socket(int family,int type,int protocol); (1)so ...
- 【深入浅出Linux网络编程】 “实践 -- TCP & UDP”
通过上一篇博客的学习,你应该对基于epoll的事件触发机制有所掌握,并且通过阅读sio.c/sio.h应该也学会了如何封装epoll以及如何通过设计令epoll更加实用(用户回调,用户参数). 简单回 ...
- 【Unix网络编程】chapter8基本UDP套接字编程
chapter8基本UDP套接字编程 8.1 概述 典型的UDP客户端/服务端的函数调用 8.2 recvfrom和sendto函数 #include <sys/socket.h> ssi ...
- Java基础知识强化之网络编程笔记04:UDP之发送端的数据来自于键盘录入案例
1. 数据来自于键盘录入 键盘录入数据要自己控制录入结束. 2. 代码实现: (1)发送端: package com.himi.updDemo1; import java.io.IOException ...
- Java基础知识强化之网络编程笔记03:UDP之UDP协议发送数据 和 接收数据
1. UDP协议发送数据 和 接收数据 UDP协议发送数据: • 创建发送端的Socket对象 • 创建数据,并把数据打包 • 调用Socket对象的发送方法,发送数据包 • 释放资源 UDP协议接 ...
- unix网络编程笔记
TCP连接状态转换图:
- 【Unix网络编程】 chapter5 TCP客户,服务器程序实例
chapter5 5.1 概述 5.2 TCP回射服务器程序:main函数 int main(int argc, char **argv) { int listenfd,connfd; pid_t c ...
- Java基础知识强化之网络编程笔记05:UDP之多线程实现聊天室案例
1. 通过多线程改进刚才的聊天程序,这样我就可以实现在一个窗口发送和接收数据了 2. 代码示例: (1)SendThread.java,如下: package com.himi.udpDemo2; ...
随机推荐
- gradle 常用命令参数
参考文档 https://docs.gradle.org/current/userguide/userguide gradle -q 任务名(task ) 执行指定某一个task gradle -q ...
- nginx之重写
rewrite可以写在server段.location段和if段.语法: rewrite regexp replacement [flag] flag是标记.有4种标记,它们的作用如下表. flag ...
- IDEA 引入外部jar包 pom 配置,防止打包失败
1. <!--添加外部依赖--> <dependency> <groupId>Ice</groupId> ...
- Chrome控制台打印输出彩色调试信息
我们都知道Chrome浏览器在控制台可以通过console.log("Hello");输出调试信息.但是每次打印的内容是黑白的难免有些单调,今天偶然的发现某网站居然能够打印彩色调试 ...
- Microsoft Visual C++ 14.0 is required
building 'twisted.test.raiser' extensionerror: Microsoft Visual C++ 14.0 is required. Get it with &q ...
- 数据挖掘 Apriori Algorithm python实现
该算法主要是处理关联分析的: 大多书上面都会介绍,这里就不赘述了: dataset=[[1,2,5],[2,4],[2,3],[1,2,4],[1,3],[2,3],[1,3],[1,2,3,5],[ ...
- OpenERP 中的on_change方法总结
1.xml中应为on_change=""的形式 2.py文件中 self,cr,uid,ids为必备参数,后面的参数根据xml文件中的参数的数量而定 3.return的是一个字典, ...
- Mac下包管理平台homebrew的使用
一.安装 参考:http://www.cnblogs.com/EasonJim/p/6287098.html 二.使用 假设我要安装node,命令如下: 安装软件 brew install node ...
- wap 往下拉自动加载更多数据
var stop=true; $(window).scroll(function(){ totalheight = parseFloat($(window).height()) + parseFloa ...
- js中in关键字的用法
1. 在For...In 声明用于对数组或者对象的属性进行循环/迭代操作. 例子:var a = new Array; for(x in a){ console.log(x); } 2. 判断对象是否 ...