精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Linux 內核網絡之 connect 的實現

系統 Linux
對于面向連接的協議,如 TCP, connect() 建立一條與指定的外部地址的連接。若在connect調用之前沒有綁定地址和端口,則會自動綁定一個地址和端口號套接口。

對于面向連接的協議,如 TCP, connect() 建立一條與指定的外部地址的連接。若在connect調用之前沒有綁定地址和端口,則會自動綁定一個地址和端口號套接口。

asmlinkage long sys_connect(int fd, struct sockaddr __user *uservaddr,
int addrlen)
{
struct socket *sock;
char address[MAX_SOCK_ADDR];
int err, fput_needed;
//根據文件描述符獲取套接口指針,并且返回是否需要減少對文件引用計數標志。
sock = sockfd_lookup_light(fd, &err, &fput_needed);
if (!sock)
goto out;
//將用戶空間的uservaddr數據復制到內核空間的address
err = move_addr_to_kernel(uservaddr, addrlen, address);
if (err < 0)
goto out_put;

err =
security_socket_connect(sock, (struct sockaddr *)address, addrlen);
if (err)
goto out_put;

//通過套接口系統調用的跳轉表proto_ops,調用connect操作。TCP 中為 inet_stream_connect(), UDP 為 inet_dgram_connect()
err = sock->ops->connect(sock, (struct sockaddr *)address, addrlen,
sock->file->f_flags);
out_put:
// 根據fput_needed標志,調用fput_light減少對文件引用計數操作
fput_light(sock->file, fput_needed);
out:
return err;
}

通過套接口系統調用的跳轉表 proto_ops ,調用 inet_stream_connect。

int inet_stream_connect(struct socket *sock, struct sockaddr *uaddr,
int addr_len, int flags)
{
struct sock *sk = sock->sk;
int err;
long timeo;

lock_sock(sk);
/* socket的協議族錯誤 */
if (uaddr->sa_family == AF_UNSPEC) {
/* 如果使用的是TCP,則sk_prot為tcp_prot,disconnect為tcp_disconnect() */
err = sk->sk_prot->disconnect(sk, flags);
sock->state = err ? SS_DISCONNECTING : SS_UNCONNECTED;
goto out;
}

switch (sock->state) {
default:
err = -EINVAL;
goto out;
case SS_CONNECTED:
err = -EISCONN;
goto out;
case SS_CONNECTING:
err = -EALREADY;
/* Fall out of switch with err, set for this state */
break;
case SS_UNCONNECTED: /* 此套接口尚未連接對端的套接口,即連接尚未建立 */
err = -EISCONN;
if (sk->sk_state != TCP_CLOSE)
goto out;

/* 如果使用的是TCP,則sk_prot為tcp_prot,connect為tcp_v4_connect() */
err = sk->sk_prot->connect(sk, uaddr, addr_len); /* 發送SYN包 */
if (err < 0)
goto out;

/* 發出SYN包后socket狀態設為正在連接 */
sock->state = SS_CONNECTING;

/* Just entered SS_CONNECTING state; the only
* difference is that return value in non-blocking
* case is EINPROGRESS, rather than EALREADY.
*/
err = -EINPROGRESS;
break;
}

/* sock的發送超時時間,非阻塞則為0 */
timeo = sock_sndtimeo(sk, flags & O_NONBLOCK);

/* 發出SYN包后,等待后續握手的完成 */
if ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) {
/* Error code is set above */
/* 如果是非阻塞的,那么就直接返回錯誤碼-EINPROGRESS。
* socket為阻塞時,使用inet_wait_for_connect()來等待協議棧的處理:
* 1. 使用SO_SNDTIMEO,睡眠時間超過timeo就返回0,之后返回錯誤碼-EINPROGRESS。
* 2. 收到信號,就返回剩余的等待時間。之后會返回錯誤碼-ERESTARTSYS或-EINTR。
* 3. 三次握手成功,被sock I/O事件處理函數喚醒,之后會返回0。
*/
if (!timeo || !inet_wait_for_connect(sk, timeo))
goto out;

err = sock_intr_errno(timeo);
/* 進程收到信號,如果err為-ERESTARTSYS,接下來庫函數會重新調用connect() */
if (signal_pending(current))
goto out;
}

/* Connection was closed by RST, timeout, ICMP error
* or another process disconnected us.
*/
if (sk->sk_state == TCP_CLOSE)
goto sock_error;

/* sk->sk_err may be not zero now, if RECVERR was ordered by user
* and error was received after socket entered established state.
* Hence, it is handled normally after connect() return successfully.
*/
/* 更新socket狀態為連接已建立 */
sock->state = SS_CONNECTED;
/* 清除錯誤碼 */
err = 0;
out:
release_sock(sk);
return err;

sock_error:
err = sock_error(sk) ? : -ECONNABORTED;
sock->state = SS_UNCONNECTED;
/* 如果使用的是TCP,則sk_prot為tcp_prot,disconnect為tcp_disconnect() */
if (sk->sk_prot->disconnect(sk, flags))
sock->state = SS_DISCONNECTING;
goto out;
}

inet_stream_connect() 主要做了以下事情:

對協議族進行檢查。

此時套接口狀態為 SS_UNCONNECTED, 調用 tcp_v4_connect() 來發送SYN包。

等待后續握手的完成:

1、如果socket是非阻塞的,那么就直接返回錯誤碼 -EINPROGRESS。

2、如果socket為阻塞的,就調用 inet_wait_for_connect(),通過睡眠來等待。在以下三種情況下會被喚醒:

  • 使用 SO_SNDTIMEO 選項時,睡眠時間超過設定值,返回 0。connect()返回錯誤碼 -EINPROGRESS。
  • 收到信號,返回剩余的等待時間。connect()返回錯誤碼 -ERESTARTSYS 或 -EINTR。
  • 三次握手成功,sock的狀態從 TCP_SYN_SENT 或 TCP_SYN_RECV 變為TCP_ESTABLISHED,sock I/O事件的狀態變化處理函數sock_def_wakeup() 就會喚醒進程。connect() 返回0。

客戶端調用tcp_v4_connect 發送SYN包時,設置客戶端狀態為 TCP_SYN_SENT。

進程休眠

static long inet_wait_for_connect(struct sock *sk, long timeo)
{
/* 初始化等待任務 */
DEFINE_WAIT(wait);
/* 把等待任務加入到socket的等待隊列頭部,把進程的狀態設為TASK_INTERRUPTIBLE */
prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);

/* Basic assumption: if someone sets sk->sk_err, he _must_
* change state of the socket from TCP_SYN_*.
* Connect() does not allow to get error notifications
* without closing the socket.
*/
/* 完成三次握手后,狀態就會變為TCP_ESTABLISHED,從而退出循環 */
while ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) {
release_sock(sk);
/* 進入睡眠,直到超時或收到信號,或者被I/O事件處理函數喚醒。
* 1. 如果是收到信號退出的,timeo為剩余的jiffies。
* 2. 如果使用了SO_SNDTIMEO選項,超時退出后,timeo為0。
* 3. 如果沒有使用SO_SNDTIMEO選項,timeo為無窮大,即MAX_SCHEDULE_TIMEOUT,
* 那么返回值也是這個,而超時時間不定。為了無限阻塞,需要上面的while循環。
*/
timeo = schedule_timeout(timeo);
/* 被喚醒后重新上鎖 */
lock_sock(sk);
/* 如果進程有待處理的信號,或者睡眠超時了,退出循環,之后會返回錯誤碼 */
if (signal_pending(current) || !timeo)
break;
/* 繼續睡眠 */
prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
}
/* 等待結束時,把等待進程從等待隊列中刪除,把當前進程的狀態設為TASK_RUNNING */
finish_wait(sk->sk_sleep, &wait);
return timeo;
}

當前進程加入到 socket 的等待隊列 sk_sleep 中,然后進入休眠,直到超時或接收到信號。

進程被喚醒

在三次握手中,當客戶端收到 SYN+ACK、發出ACK后,連接就成功建立了。此時連接的狀態從TCP_SYN_SENT或TCP_SYN_RECV變成了 TCP_ESTABLISHED,表示連接建立成功。最終會調用 sock_def_wakeup() 來處理連接狀態變化事件,喚醒進程,connect()成功返回。

調用過程如下

tcp_v4_rcv

-> tcp_v4_do_rcv

-> tcp_rcv_state_process

-> tcp_rcv_synsent_state_process

-> sk_wake_async(sk, 0, POLL_OUT);

static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb,
struct tcphdr *th, unsigned len)
{
...

if (!sock_flag(sk, SOCK_DEAD)) {
/* 指向sock_def_wakeup,會喚醒調用connect()的進程,完成連接的建立 */
sk->sk_state_change(sk);
/* 若采用異步通知,則發送SIGIO通知進程可寫 */
sk_wake_async(sk, 0, POLL_OUT);
}

...
}

當鏈路建立成功后異步發送SIGIO信號,喚醒阻塞的進程并通知 socket 可寫,這也就是為什么非阻塞調用 connect 時檢查 socket 是否可寫事件的原因。

static void sock_def_wakeup(struct sock *sk)
{
read_lock(&sk->sk_callback_lock);
/* 有進程阻塞在此socket上 */
if (sk->sk_sleep && waitqueue_active(sk->sk_sleep))
/* 喚醒此socket上的所有睡眠進程 */
wake_up_interruptible_all(sk->sk_sleep);
read_unlock(&sk->sk_callback_lock);
}

最終調用 __wake_up_common(),由于nr_exclusive 為 0,因此會把此socket 上所有的等待進程都喚醒。

責任編輯:華軒 來源: 今日頭條
相關推薦

2023-03-01 23:56:11

2023-03-01 23:53:30

Linuxshutdown進程

2023-03-28 15:51:20

2023-03-06 15:43:56

2021-09-17 11:59:21

tcpdump網絡包Linux

2021-09-08 10:21:33

內核網絡包Tcpdump

2024-08-22 14:47:50

開源Linux網絡抓包工具

2009-07-16 09:02:38

LINUX 2.4.x網絡安全LINUX開發

2025-03-07 08:30:00

pwruLinux網絡包追蹤

2025-10-13 02:11:00

2023-05-12 07:27:24

Linux內核網絡設備驅動

2010-07-19 10:05:52

ibmdwLinux

2021-11-15 04:00:07

Linux 內核動態

2021-11-14 07:29:55

Linux 內核靜態追蹤Linux 系統

2021-04-15 05:51:25

Linux

2013-12-18 14:44:10

2021-08-23 06:59:38

Linux內核代碼

2021-09-30 09:43:11

Linux內核Zstd補丁

2023-11-24 11:24:16

Linux系統

2021-05-31 07:30:47

Connectsocket函數
點贊
收藏

51CTO技術棧公眾號

亚洲一区二区免费| 久久精品国产精品亚洲| 亚洲精品乱码久久久久久自慰| 青青视频在线观| 麻豆精品视频在线| 久久久久久久一区二区| 亚洲а∨天堂久久精品2021| 经典三级久久| 欧美性色视频在线| 青少年xxxxx性开放hg| 色窝窝无码一区二区三区成人网站 | 亚洲麻豆一区二区三区| 成人视屏在线观看| 亚洲综合色丁香婷婷六月图片| 欧美日韩在线一区二区三区| 国产精品视频久久久久久| 小嫩嫩精品导航| 久久成人精品一区二区三区| 乐播av一区二区三区| 视频一区中文字幕精品| 欧美在线视频全部完| 97中文字幕在线| 快射视频在线观看| 久久综合久久久久88| 97se在线视频| 在线视频欧美亚洲| 久久成人亚洲| 午夜精品久久久久久久99热浪潮| 国产高清视频免费在线观看| 亚洲另类av| 亚洲成人精品在线| 一级 黄 色 片一| 亚洲精品一区三区三区在线观看| 午夜精品123| 欧美黄网在线观看| 黄色成人影院| 国产精品第一页第二页第三页| 久久久婷婷一区二区三区不卡| 国产黄色av片| 国产在线看一区| 国产欧美欧洲在线观看| 无码一区二区三区| 香蕉亚洲视频| 奇米成人av国产一区二区三区| 国产无遮挡aaa片爽爽| 亚洲欧美综合久久久| 日韩在线免费av| 亚洲午夜精品久久| 免费理论片在线观看播放老| 成人黄色大片在线观看| 成人片在线免费看| 丰满人妻一区二区| 东方欧美亚洲色图在线| 91香蕉视频在线下载| 91午夜交换视频| 激情五月婷婷综合| 96sao精品视频在线观看| 97人妻精品一区二区三区| 男女男精品视频| 国产精品一区二区三区成人| 92久久精品一区二区| 精彩视频一区二区三区| 国产在线久久久| 国产美女三级无套内谢| 国产高清不卡二三区| 亚洲综合最新在线| 超碰福利在线观看| 国产福利精品导航| 精品国产一区二区三区日日嗨 | 久青草视频在线观看| 欧美黄色一级视频| 欧美精品video| 日韩高清免费av| 亚洲自啪免费| 国产精品成久久久久三级| 在线观看国产精品视频| 国产一区在线视频| dy888夜精品国产专区| 日本xxxx人| 久久影院视频免费| 在线观看成人av电影| 在线观看午夜av| 黄色精品在线看| 激情五月婷婷久久| 国产精品成人3p一区二区三区| 日韩一级片网站| 国产乱了高清露脸对白| 欧美日韩一区二区综合| 久久精品视频免费播放| 国产在线观看你懂的| 亚洲欧美日本国产专区一区| 国产一区二区香蕉| 欧洲成人一区二区三区| 欧美国产精品中文字幕| 日本a在线天堂| 日本综合久久| 欧美成人在线直播| 蜜桃av免费看| 久久久久久久久国产一区| 国模精品视频一区二区三区| 国产第一页在线观看| 国产精品一区二区久久不卡| 蜜桃视频成人| 欧洲成人综合网| 欧美性大战久久久久久久 | 1313精品午夜理伦电影| 亚洲人成亚洲人成在线观看| 国精品无码一区二区三区| 国产欧美日本| 亚洲一区二区三区毛片| 欧美挠脚心网站| 亚洲综合视频在线| 另类小说色综合| 婷婷精品在线观看| 精品中文字幕乱| 日本欧美www| www.欧美.com| 黄黄视频在线观看| 91p九色成人| 日韩精品视频免费| 久久久久久久久艹| 黄色日韩网站视频| 涩涩涩999| 欧美日韩在线观看首页| 欧美一级理论片| 91免费在线看片| 日韩成人伦理电影在线观看| 精品乱色一区二区中文字幕| 在线网址91| 欧美一区二区三区爱爱| 三年中国中文观看免费播放| 国产日产高清欧美一区二区三区| 亚洲永久免费观看| 午夜视频在线| 欧美日韩一级视频| 日韩一级av毛片| 久久婷婷丁香| 欧美日韩一区二区视频在线观看 | 成人有码在线视频| av网在线观看| 欧美色视频一区| 国产熟女一区二区| 日本在线观看不卡视频| 青青草原亚洲| 欧美成人性网| 亚洲一区第一页| 亚洲视频 欧美视频| 91天堂素人约啪| 男人天堂999| 影视先锋久久| 国产精品99久久99久久久二8| 嫩草精品影院| 欧美中文一区二区三区| 日本少妇xxxxx| 免费观看日韩电影| 亚洲欧洲一区二区福利| 成人激情视屏| 色伦专区97中文字幕| 91激情在线观看| 亚洲欧洲制服丝袜| 男人的天堂免费| 亚洲黄色av| 欧美日韩日本网| 成人福利片在线| 另类专区欧美制服同性| 午夜精品一二三区| 亚洲成人动漫一区| 少妇久久久久久久久久| 蜜桃av一区二区在线观看| 在线一区日本视频| 日韩第一区第二区| 国语自产精品视频在线看| 婷婷开心激情网| 在线观看91视频| 可以免费看av的网址| 国产精品18久久久久久久久久久久| 日本a在线天堂| 亚洲黄页网站| 国产在线观看91精品一区| 日本aa在线| 亚洲日本成人女熟在线观看| 一级黄色免费看| 亚洲一区二区在线观看视频| 亚洲专区区免费| 看片的网站亚洲| 国产精品一线二线三线| 国产精品一区二区av日韩在线| 国产欧美一区二区| av手机免费在线观看| 国产性色av一区二区| 国产精品久久777777换脸| 亚洲午夜视频在线观看| 国产视频三区四区| 高清在线不卡av| 天堂社区在线视频| 影音先锋久久| 亚洲一区二区在线看| 91午夜精品| 国产精品91久久久久久| 国产99re66在线视频| 在线观看久久久久久| 亚洲国产成人一区二区| 欧美丝袜自拍制服另类| 国产午夜视频在线| 中文字幕va一区二区三区| 91精产国品一二三| 免费观看日韩电影| 国产91xxx| 午夜视频一区| 亚洲国产一区二区精品视频| 国产精品丝袜在线播放| 国产日韩亚洲欧美| 婷婷激情一区| 91精品国产高清自在线| caopeng在线| 中文字幕免费精品一区高清| 午夜视频www| 欧美一区二区视频网站| 自拍偷拍第八页| 日韩欧美国产中文字幕| 免费在线观看黄色av| 亚洲欧洲色图综合| 亚洲а∨天堂久久精品2021| 91在线一区二区三区| 日韩高清一二三区| 国产九色精品成人porny| 99热手机在线| 日日夜夜免费精品| 国产91在线视频观看| 狠狠色丁香久久综合频道| 国产精品亚洲天堂| 日韩.com| 亚洲免费视频一区| 禁断一区二区三区在线| 蜜桃导航-精品导航| 欧美日日夜夜| 久久www免费人成精品| 国产一区二区三区不卡av| aa日韩免费精品视频一| 亚洲日本va| 成人黄色片视频网站| 国产欧美日韩电影| 亚洲在线免费观看| 精品国产一区二区三区2021| 92国产精品久久久久首页 | 国产精品久久久久久免费观看 | 久久久男人天堂| 91av国产在线| 欧美www.| 国产精品视频地址| 欧美成人高清视频在线观看| 成人国产精品久久久久久亚洲| 日韩大陆av| 91九色蝌蚪国产| 日韩精品成人在线观看| 成人91视频| 偷窥自拍亚洲色图精选| 欧美极品一区二区| 欧美精选一区二区三区| 亚洲免费在线精品一区| 一精品久久久| 国产玉足脚交久久欧美| 免播放器亚洲| 免费一级特黄录像| 国产乱人伦偷精品视频不卡| 日本人妻一区二区三区| 99国产精品99久久久久久| 亚洲理论片在线观看| 国产精品久久久久一区二区三区| 日韩av手机在线免费观看| 亚洲国产精品一区二区尤物区| 精品国产免费观看| 在线观看av一区二区| 国产精品天天操| 亚洲成人黄色网| 国产精品无码2021在线观看| 日韩有码在线视频| 国产又色又爽又黄刺激在线视频| 91精品国产色综合| 福利一区二区三区视频在线观看| 91久久精品日日躁夜夜躁国产| www.豆豆成人网.com| 蜜桃麻豆www久久国产精品| 欧美mv日韩| 日本丰满少妇xxxx| 麻豆久久久久久| 一级黄色免费视频| 国产午夜精品美女毛片视频| 国产成人综合在线视频| 欧美日韩激情视频| 一区二区三区精彩视频| 亚洲精品在线一区二区| 国产精品一二三区视频| 欧美极品少妇xxxxⅹ免费视频| 免费电影日韩网站| 91在线视频成人| 久久成人高清| 91网站在线观看免费| 日本不卡免费在线视频| 男女性杂交内射妇女bbwxz| 国产精品情趣视频| 国产三级av片| 日韩欧美国产一区二区三区| 国产一二三区在线视频| 欧美激情精品久久久久久蜜臀 | 日韩成人一级片| 国产一精品一aⅴ一免费| 国产女人18水真多18精品一级做| 久久黄色免费视频| 欧美日韩一区高清| 手机看片一区二区| 久热国产精品视频| 精品3atv在线视频| 国产伦精品一区二区三区视频孕妇| 色爱综合网欧美| 老熟妇仑乱视频一区二区| 成人免费看视频| 欧洲猛交xxxx乱大交3| 欧美性猛交xxxxxx富婆| 欧美色综合一区二区三区| 欧美大片免费观看在线观看网站推荐| 国模私拍国内精品国内av| 欧美高清一区二区| 亚洲精品韩国| 成人一区二区三区仙踪林| 日韩美女视频19| 亚洲系列在线观看| 亚洲性夜色噜噜噜7777| 高清不卡亚洲| 久久久久久欧美精品色一二三四| 亚洲欧美亚洲| 国产高清999| 国产精品护士白丝一区av| 色婷婷久久综合中文久久蜜桃av| 日韩精品极品在线观看| 成人影院在线视频| 国产精品18毛片一区二区| 重囗味另类老妇506070| 在线观看日本www| 综合久久综合久久| 97超碰国产在线| 久久激情五月丁香伊人| 伊人亚洲精品| 日韩中文在线字幕| 国产一区二区h| 精品无码免费视频| 欧美成人一区二区| 免费在线国产视频| 国产欧美日韩伦理| 国产欧美一级| 亚洲日本精品视频| 在线观看欧美黄色| 午夜不卡视频| 成人黄色片网站| 欧美不卡高清| 亚洲婷婷在线观看| 偷偷要91色婷婷| 裸体xxxx视频在线| 国产精品久久久久高潮| 日韩理论电影| 两女双腿交缠激烈磨豆腐| 一区二区三区波多野结衣在线观看 | 亚洲最大的黄色网址| 欧美成人性福生活免费看| 97天天综合网| 日韩av在线电影观看| 麻豆高清免费国产一区| 精品国产精品国产精品| 亚洲аv电影天堂网| 老司机深夜福利在线观看| 日韩中文字幕av在线| 久久国产精品第一页| 激情五月婷婷在线| 日韩精品黄色网| 日韩免费在线电影| 国产资源在线免费观看| 久久色.com| 国产精品视频一二区| 91国产精品视频在线| 日韩精品1区| 日本一级大毛片a一| 色婷婷av一区二区三区软件| 精品孕妇一区二区三区| 国产99午夜精品一区二区三区 | 国产精品黄页免费高清在线观看| 偷拍欧美精品| 国产又粗又猛又色| 欧美午夜精品一区二区蜜桃| 在线heyzo| 欧美lavv| 国产精品亚洲专一区二区三区| 久久艹免费视频| 久久久精品在线观看| 午夜欧洲一区| 亚洲天堂网站在线| 一本久道久久综合中文字幕| 国产精品va在线观看视色| 免费在线观看一区二区| 国产精品77777| 中文 欧美 日韩|