STUDY/정글

[네트워크] TCP 소켓 통신 구조 정리

Nobb 2025. 11. 5. 00:58

: 커널 안에서 소켓이 생성되고, 서로 연결되는 전 과정

 

# 서버 측

1- 소켓 생성

//소켓 생성
int listenfd = socket(AF_INET, SOCK_STREAM, 0);

 

--> 커널: TCP용 IPv4 소켓 하나 만듦

 


 

2- 소켓 <- IP+포트번호 bind

// [IP+포트번호] 설정
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(8080);
bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr));

 

--> 커널: 이 소켓은 0.0.0.0 : 8080 (=모든 IP의 8080포트) 담당하도록 설정

 


 

3- listen() :연결 받을 준비 완료

listen(listenfd, 10);

 

--> 커널: 8080포트에서 클라 연결 받을 준비 완료시킴 (연결요청 동시대기 최대 개수: 10)

 


4- accept():  연결 수락

int connfd = accept(listenfd, (struct sockaddr*)&cliaddr, &clilen);

 

--> 커널: 새 소켓 복제해서, 클라의 IP/포트 정보를 연결 정보로 채워넣음

 

 


 

# 클라 측

 

1- 소켓 생성

int sockfd = socket(AF_INET, SOCK_STREAM, 0);

 

--> 커널: 클라이언트용 TCP소켓 하나 생성 (IPv4)

 

 

2- connect()

 

--> 커널:

1) 서버주소 읽음

2) 클라쪽 IP/포트 자동 할당 (ex. 127.0.0.1 : 52341)

3) TCP 3-way handshaking 실행

4) 연결 성공 시 상태 변경

 

 

 

>>> 연결 완성 후

 -> 이제 클라의 sockfd <----> 서버의 connfd

둘이 커널 레벨에서 TCP로 연결된 한쌍의 통로 됨