총 20byte로 구성(32bits(=4bytes) * 5)
source port#, dest port# : 송/수신측 포트 넘버
sequence number : 전체 데이터 스트림 중 몇 번째 인지 알려주는 넘버
segment's data의 첫번째 byte
acknowledge number: 수신측이 다음으로 받을 시퀀스 넘버이자 특정 번호까지 잘 받았다는 응답(누적 ACK 활용)
acknowledgement : 수신측이 다음으로 받을 byte
Flags(U,A,P,R,S,F): 1 비트 플래그, U 와 P는 사용 안함, R,S,F는 TCP 연결 관리에 사용
A : acknowledge number 의 유효성 검사시 사용
RST(R) : RESET, 연결 재설정 표시
SYN(S) : 연결 시작시 사용
FIN(F) : 연결 종료시 사용
Receive Window : 흐름제어에 사용, 수신버퍼의 남은 공간의 크기를 적어 송신자에게 알려줌, 송신자는 이를 보고 unACKed 의 데이터 크기가 이 필드의 값을 넘지 않도록 하여 오버플로우를 방지
checksum : 에러 체크 용도
TCP의 RTT를 적당히 설정해둘 필요성 존재
너무 길면 segment 손실에 대응이 느리고, 너무 짧으면 타이머가 일찍 종료되어 불필요한 재전송이 발생
1-2. 비 정상적 순서대로 세그먼트를 기대한 값보다 큰 시퀀스 넘버 수신시, 즉시 duplicated ACK전송(다음 예상 바이트의 시퀀스 넘버)
수신측이 송신측을 control, 따라서 송신측이 수신측의 버퍼처리속도 보다 더 빠르게 데이터를 보내지 않는 것
수신 버퍼의 담은 공간을 Rwnd(Receive Window), 이 공간의 크기는 전체 공간에서 buffered-data 만큼의 공간을 빼면 됨.
수신자는 TCP 세그먼트 헤더에 남은공간의 크기를 적어 송신자에게 알려주고,
송신자는 unACKed 데이터의 크기가 Rwnd 의 값을 넘지 않도록 조절함.
수신측은 ACK을 받지 않고 보낼 수 있는 데이터의 크기인 window 값과 RcVWindow 값 중 가장 작은 것으로 제한.
만약 송신측이 중복된 ACK을 3번 받았을때, 바로 재전송을 하는 기능.
TCP의 송신과 수신측은 데이터 세그먼트들을 주고 받기 전 연결(handshake)을 맺음,
이때 시퀀스 넘버, 버퍼 사이즈, 흐름제어 관련 변수들이 초기화 되어 설정
수신측(서버)는 특정 포트번호를 보내어 소켓 생성, welcomeSocket을 갖고 송신(클라이언트)측 요청에 대기.
클라이언트는 소켓 생성시 연결한 서버의 ID, port#을 주면 바로 서버의 welcomeSocket을 갖고 three-way handshaking을 시작.
수신측은 송신측으로 부터 요청이 오면, 이데 대흥하는 한개의 소켓(connection socket)을 생성하여 클라이언트와 연결, 연결 완료시 데이터 전송은 수신측(클라이언트)의 소켓과 송신측(서버)의 연결 소켓 간 직접 이루어진다.
1단계, 클라이언트 -> 서버(SYN)
클라이언트는 SYNbit 가 1로 설정된 TCP SYN 세그먼트를 서버로 전송.
이때 시퀀스 넘버를 지칭하여 보냄(X), 데이터는 포함하지 않음
state를 SYNACK을 기다리는 SYNSENT 상태로 변경
2단계 서버 -> 클라이언트(SYNACK)
서버에는 SYN 세그먼트 요청을 받고 TCP연결을 수락하면 TCP와 버퍼 변수를 설정.
응답으로 SYNACK(SYN bit: 1, ACK bit:1) 세그먼트를 클라이언트로 보냄.
시퀀스 넘버는 클라이언트의 시퀀스 넘버에 1을 더해서 보냄
3단계 클라이언트 -> 서버(ACK)
클라이언트는 SYNACK 세그먼트를 수신하면 응답으로 데이터를 포함하는 ACK 세그먼트(SYN bit: 0, ACK bit:1)을 보냄
흐름 제어를 통해 송신-수신자의 일대일 사이간 패킷 수를 조절했다면,
혼잡제어는 전체 네트워크 내의 패킷 수를 조절하여 네트워크의 overflow를 방지.
혼잡 회피 방식의 첫번째 방법으로 AIMD(합 증가, 곱 감소) 알고리즘이 있다.
더할때는 증가시키고, 반으로 줄여 감소시킨다.
송신자, 처음에 하나의 패킷을 전송. 문제가 없다면 2개를, 3개를... 이렇게 늘려나가다가 패킷이 전송되자 않거나 타임아웃 발생시 윈도우 사이즈를 절반으로 감소 시킨다.
모든 호스트가 공평히 네트워크를 사용하지만, 초기 네트워크의 큰 대역폭을 바로 사용하지 못하며, 혼잡 상태가 발생한 다음에 대역폭을 감소시킨다는 단점이 존재
느린 시작이지만 시작부터 빠르게 윈도우를 증가시키고 특정 시기가 오면 윈도우를 확 줄이는 방식
AIMD와 마찬가지로 처음엔 하나의 패킷을 보내고 그다음 2개, 4개,8개...즉 윈도우 사이즈를 두배씩 증가시키다가,
혼잡 현상 발생시 윈도우 사이즈를 1로 줄여버리는 것.