TCP 전송

공부기록·2023년 10월 15일
0
post-thumbnail

함수정리


서버의 함수 호출 순서

listen( )

	#include <sys/type.h>
    
    int listen(int sock, int backlog);
    
    /*성공시 0, 실패시 -1 반환*/
  • 인자
    • sock : 연결요청 대기상태로 만들고자하는 socket의 fd
    • backlog : 연결요청 대기 큐의 크기
  • 연결요청이라는 데이터를 받기위해 소켓을 리스닝 소켓으로 만드는 함수이다.

accept( )

	#include <sys/socket.h>
    
    int accept(int sock, struct sockaddr* addr, socklen_t* addrlen);
    
    /*성공시 fd, 실패시 -1 반환*/
  • 인자
    • sock : 서버소켓의 fd
    • addr : 연결요청 한 클라이언트의 주소정보를 받을 인자
    • addrlen : 주소변수의 크기 (byte단위)
  • 클라이언트의 연결요청을 수락하는 함수
  • 이 과정까지 마치면 소켓간의 데이터의 송수신이 이루어진다. 데이터 송수신이 이루어질 소켓도 생성된다.



클라이언트의 함수 호출 순서

connect( )

#include <sys/socket.h>

int connect(int sock, const struct sockaddr* servaddr, socklen_t addrlen);

/*성공시 생성된 소켓 fd, 실패시 -1 반환*/
  • 인자
    • sock : 클라이언트 소켓의 fd
    • servaddr : 연결요청한 클라이언트의 주소정보를 받을 주소 값
    • addrlen : servaddr에 전달된 주소의 변수 크기(byte 단위)



Three-way handshake


  • SYN : data를 담지않으며 하나의 sequence number를 소모한다.
  • SYN + ACK : data를 담지않으며 하나의 sequence number를 소모한다.
  • ACK : data도 sequence number도 갖지않는다.



Data Transfer


  • control bit의 P 무시, 마지막의 seq 무시



Termination


  • FIN : data는 담겨있지 않지만 sequence number 하나를 소모한다.
  • FIN + ACK : data는 담겨있지 않지만 sequence number 하나를 소모한다.



Half-Close


  • client가 FIN을 선언(active close)하지만 server에서는 아직 보낼 데이터가 남아있으므로 ack만 보낸 상태
  • client측의 sending buffer는 없애고 receiving buffer만 남겨두고 받은 data의 대한 ack 전송한다.
  • 후에 server에서 FIN을 선언(passive close)하면 그것에 대한 ack을 보낸후 connection을 종료한다.




연결에 대한 전체적인 개요도


  • TIME-WAIT이 필요한 이유?
    • server가 FIN + ACK을 보냈을 때 client에서 ACK을 보냈는데 그게 유실되면 서버측에서는 FIN을 한 번 더 보낸다. 이때 server의 FIN을 처리할 수 있도록 잠시 기다린 다음 연결을 종료한다.
    • 데이터가 잘못보내진 후 연결이 끊어졌을때 만약 그 client가 다시 연결되면 같은 포트번호를 부여받아 잘못된 데이터를 전송받을 확률이 있으므로 잠시 포트번호를 잡아두어 새로 시작한 연결은 새로운 포트번호를 부여받게끔 한다.

0개의 댓글

관련 채용 정보