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; ...
随机推荐
- TSL协议升级导致的问题:caught when processing request: Received fatal alert: protocol_version
近日,公司升级TSL协议,禁用TSL1.0,导致原本好好的https接口,报以下错误: 2019-03-05 15:43:29 [org.apache.commons.httpclient.HttpM ...
- 核心API的使用(给定一个字符串,统计每个字符出现的次数)
/** * 给定一个字符串,统计每个字符出现的次数. 如:abdaewrwqask435a1aasd */public class ReplaceString { static int length; ...
- 架构师养成记--24.linux常用命令
一.Linux 文件 根据上文Linux 文件说明1.文件的rwx d开头表示文件夹, -开头的表示文件, l开头表示链接文件 r:read,w:write,x:execute ...
- shell-009:删除字母
把一个文件里的前100行中有字母的行删除:再把101-200行的字母去掉 #!bin/bashsed '101.200s/[a-zA-Z]//g' filesed -n '1.100'p file | ...
- 【HNOI2019】部分题简要题解
题意懒得写了 LOJ Day 1 T1 鱼 个人做法比较猎奇,如果有哪位大佬会证明能分享一下的话感激不尽. 题解:枚举鱼尾和鱼身的交点D,将所有其他点按照到D的距离排序,距离相同的分一组. 感性的理解 ...
- prim /kruskal 最小生成树
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #inc ...
- OS X获取process.env.NODE_ENV出错
原来项目是其它小组在维护,现在我们需要维护部分功能,把项目带到OS X上运行发现 webpack.config.js获取process.env.NODE_ENV变量出错 解决: 根据电脑操作系统平台类 ...
- 利用flask-sqlacodegen快速导入ORM表结构
利用flask-sqlacodegen快速导入ORM表结构 友情提示:如果是使用pymysql请预先pip install 哦~ 这是window下使用virtualenv环境下执行的 Linux用户 ...
- linux安装使用xdebug
我还是来给大家一个正确的配方,每个人的php版本不一样 所以下载的xdebug应该是不一样的 1,https://xdebug.org/wizard.php 进入这个网页 把自己phpinfo的信 ...
- vuex requires a Promise polyfill in this browser
ie 浏览器访问 vue 项目(使用的vuex 状态管理组件)报错:vuex requires a Promise polyfill in this browser 处理办法: 1.npm insta ...