본문으로 이동

미디어위키 1.45 안정화가 거의 끝났습니다. 다만 Flow 확장 기능 관련 이슈가 있어서 대체하는 작업을 수행할 계획입니다.

  1. 큰숲백과:청사진에서 위키 발전의 대략적인 방향성을 제시했습니다. 의견이 있으신 분은 큰숲백과토론:청사진에서 의견을 남겨주시면 좋겠습니다.
  2. 기능상의 오류로 지원하지 않고 있는 기능에 대해서는 큰숲백과토론:이슈 트래커에 요약했습니다. 참고하시기 바랍니다.
  3. 데이터베이스 덤프 받고싶으신 분은 큰숲백과 가입 후에 사용자토론:Bigforest에 의견 남겨주시면 ftp 주소, 계정, 비밀번호를 특수:EmailUser를 통해서 공개할 예정입니다.

TCP

큰숲백과, 나무를 보지 말고 큰 숲을 보라.

전송 제어 프로토콜(Transmission Control Protocol)은 인터넷 프로토콜과 함께 인터넷의 근간을 이루는 양대축이다. 둘을 묶어서 TCP/IP로 자주 부르는 데, 원래 둘이 한 몸이었기 때문이다.

OSI 참조 모델 4계층(전송 계층)에 속하는 TCP는 가상 회선 방식으로 연결 지향형이며, 에러 검출이나 흐름 제어가 가능한 신뢰적 프로토콜이다.

TCP/IP로 묶어서 불리게 된 가장 큰 원인은 둘의 다른 특성에 기인한다. IP는 best-effort, 즉 원본(Source; SRC)에서 목적지(Destination; DST)까지 연결되었는지 안 되었는지는 상관하지 않고, 그저 "목적지까지 도달해라 얍!"하고 보내면 끝이라는 뜻이다. 때문에 IP 만으로는 연결이란 개념을 만들어 낼 수가 없었고, 그래서 connection-oriented, 연결 지향적인 TCP 프로토콜이 제안되었으며, TCP는 동기화 등을 통해 의사적으로 원본과 목적지와의 연결을 구현한다.

여기에 TCP는 추가적으로 들어온 내용을 분류하기 위한 역할(포트 번호)도 담고 있으며, 연결 개념이 필요하지 않은 경우에도 포트 번호를 통해 들어온 내용을 분류하기 위해 UDP라는 프로토콜이 같이 굴러간다. 사실 TCP와 UDP만 알면 OSI 4계층은 거진 다 배운거다.

  • 데이터 연결 방식을 구분짓기 위한 포트 개념이 있다. 보통 HTTP는 80번, SSH는 22번, HTTPS는 443번 같은 것이다. IANA는 핵심적인 통신 방식들이 주로 쓰는 1023까지의 포트 범위를 제외하고 1024~41951 범위의 포트는 널리 배포되는 프로그램들이 쓰도록 권장하며, 그 이상은 아무렇게나 사용하도록 풀어두었기에 프로그램 테스트 목적으로 내부적으로 사용하는 용도로 삼도록 권장한다.
  • 통신 대상끼리의 1대1 연결이며, 스트림 방식의 연결을 수행하여 연결에 안정성이 있다.
  • 데이터를 세그먼트로 패키징하여 IP에 넘겨주고, IP가 받은 패킷을 디코딩하는 IP의 상위 OSI 계층이다. IP가 패킷을 만들기 전 단계에 미리 데이터의 순서를 세그먼트에 기록하기에 데이터의 순서에 따른 정렬, 중복 검사 등을 수행한다. 이때 순서값이 되는 ISN은 초기화 기능이 없이 무조건 호스트가 증가만 시킬 수 있어 32비트 정수의 최대값에 도달하면 오버플로우로 0이 된다.
  • 답신으로 전송 완료를 확인하는 기능이 규격에 있어 받지 못했다는 판단이 드는 시간 초과의 경우 다시 보내게 할 수 있다.
  • 수신자의 TCP로 들어온 데이터의 버퍼가 다 차면 답신으로 특정 시점에서 버퍼가 다 찼음을 송신자에게 알려 전송을 중단할 수 있다.

세그먼트

[편집 | 원본 편집]
세그먼트(Segment)
헤더(20~60바이트) 데이터
헤더(Header)
16비트 16비트
발신지 포트 목적지 포트
시퀀스 번호
응답 번호
헤더 길이 및 제어 필드 윈도우 크기
체크섬 긴급 지시자
옵션 및 여유공간
~ 40바이트

세그먼트(Segment)는 TCP가 보내는 덩어리(PDU)의 이름으로, 이걸 IP 패킷에 담아서 인터넷에 쏜다. UDP는 데이터그램이라는 이름 그대로 부른다.

세그먼트의 첫 머리인 헤더는 20바이트가 기본이고, 옵션에 따라 60바이트까지 늘어날 수 있다. 대체로 아래의 내용이 담겨있다.

  • 출도착 포트
    TCP는 응용 계층에서 데이터를 받아오는 데, 응용 계층은 어플리케이션이 전적으로 담당하는 구간으로 TCP 입장에서는 호스트 구분 대신 어플리케이션 구분이 필요하다. 이것을 포트 번호로 구분하며, 16비트로 1번부터 65536번까지 존재한다. 이것과 호스트 주소를 합쳐서 부르는 주소 형식이 "소켓"이다. 출도착 호스트 구분은 3계층 이하에서 하는 일이다. 보통 출발 포트가 well-known 포트(80, 443, 22 등)가 아니면 클라이언트로 well-known포트이면 서버인 경우가 많다.
  • 시퀀스 번호(SEQ)/응답 번호(ACK)
    TCP는 신뢰성 프로토콜로, 오가는 모든 내용에 번호를 붙여서 올바르게 통신하고 있는지 확인한다. 시퀀스 번호는 발송자가 보낼 때 랜덤 번호로 생성하고 기재하는 번호고, 응답 번호는 상대방의 세그먼트를 수신했다는 의미로 받았던 상대방 시퀀스 번호에 +1을 하여 응답한다. 그러면 상대방은 +1된 번호 그대로 시퀀스 번호에 기재하여 보낸다.
  • 제어 필드
    이 세그먼트가 무슨 목적으로 보내지는 건지 표시하는 부분이다. 일반적인 통신에는 응답 번호가 같이 실려가므로 ACK 플래그가 항상 서 있고, 최초 통신 개시때는 서로의 시퀀스 번호를 맞춰야 한다는 표식인 SYN 플래그를 세워 보내고, 데이터 송수신이 종료된 시점에는 연결을 종료하자는 FIN 플래그를 세워 보낸다. 총 6개의 플래그가 규정되어 있다. 한 세그먼트에 한 종류의 플래그만 설정되는 것이 아니고 예를 들면 클라이언트의 순서 번호를 설정한 후 서버에서 응답을 보냈음을 나타낸 ACK 플래그와 서버의 순서 번호를 설정하는 SYN 플래그가 동시에 설정될 수 있다.
  • 윈도우 필드
    송신 시스템의 가용 버퍼 크기다.
  • 체크섬 필드
    데이터가 손상 없이 제대로 전송되었는지 확인할 수 있는 필드다

각주

이 문서의 출처는 리브레 위키의 TCP 문서의 1227737판입니다.