티스토리 뷰

접속(connect)

커넥션: 소켓끼리의 연결을 의미

  1. 소켓 한개분량의 메모리 영역 확보 ->제어정보를 기록한다
  2. Application의 connect 호출: 접속단계
    1. 수신측의 IP주소와 포트번호를 통해 연결이 가능한지 확인
    2. 데이터를 임시적으로 저장하는 버퍼메모리 생성
  3. 프로토콜 스택에 서버 IP와 포트번호를 받아 TCP담당 부분에 전달
  4. 제어정보를 이용하여 TCP 헤더생성
    1. 컨트롤 비트 SYN을 1로설정(초기 접속 시)
  5. IP담당 부분에 전달
  6. 수신측 소켓과 연결(상세한 부분 생략)
  7. 응답 시 ACK비트 설정 -> 연결 되었음을 확인

작성(write)

송신

접속(connect)이후의 동작으로 송신하려는 데이터를 프로토콜 스택에 전달

  • 프로토콜스택에 버퍼메모리에 데이터를 임시저장
    • 네트워크 이용효율을 위해 패킷을 적당한크기로 보내기 위함, MTU와 MSS를 이용하여 판단
    • 프로토콜 스택 내부의 타이머로 일정시간을 측정하면 패킷 송신
    • 수신측에서 ACK이 제대로 오지 않을경우 임시 메모리의 데이터를 다시 전송 
      • 수신측도 동일하게 클라이언트로 데이터를 보낼경우 ACK을 반환 받아야하며 받지 못할 경우 다시 전송한다.
      • 계속해서 오류가 난다면 오류를 통지하고 송신 동작을 강제로 종료한다.
  • Application에서 데이터를 언제 송신할지 설정이 가능하다
    • 버퍼에 머물지 않고 바로 송신
    • 송신 타이밍 제어

수신(read)

패킷이 올바르게 도착하였는지 확인하여야한다

  • SEQ(시퀀스번호): 몇번째 바이트에 해당하는지 기록하는 TCP 컨트롤비트
  • 수신확인응답: 누락한 데이터가 없을 시 ACK 번호 기록
    • ACK = SEQ + data.length

응답메시지 받기 (read)

  • 버퍼메모리에 있는 데이터를 Application으로 넘겨준다.
  • 버퍼메모리가 비게 되면 다시 데이터를 받아 또 Application으로 건네준다.

종료

  • FIN 컨트롤 비트를 1로 설정함으로써 연결을 끝는다
  • 4 hand shaking 
    • 클라이언트 FIN 송신
    • 서버 ACK 반환
    • 서버 FIN 송신
    • 클라이언트 ACK 반환
  • 소켓 정보 말소

ACK 관리(close)

  • 대기 시간 관리: ACK번호가 돌아오는 시간을 계측하여 유동적으로 대기시간 설정
  • 윈도우 제어방식: 윈도우사이즈(수신가능한 데이터의 최대값)를 통지하여 데이터의 양이 넘지않게 한다 -> 윈도우 필드 설정
  • ACK번호와 윈도우 통지 타이밍 고려하기

Reference

성공과 실패를 결정하는 1%의 네트워크 원리